harmony 鸿蒙使用AVMetadataExtractor获取元数据(C/C++)

  • 2025-06-12
  • 浏览 (4)

使用AVMetadataExtractor获取元数据(C/C++)

使用AVMetadataExtractor可以实现从原始媒体资源中获取元数据,本开发指导将以获取一个音频资源的元数据作为示例,向开发者讲解AVMetadataExtractor元数据相关功能。视频资源的元数据获取流程与音频类似,由于视频没有专辑封面,所以无法获取视频资源的专辑封面。

获取音频资源的元数据的全流程包含:创建AVMetadataExtractor、设置资源、获取元数据、获取专辑封面、销毁资源。

开发步骤及注意事项

在 CMake 脚本中链接动态库。

target_link_libraries(entry PUBLIC libavmetadata_extractor.so libace_napi.z.so )

使用OH_AVFormat相关接口时,需引入如下头文件。

#include <multimedia/player_framework/native_avformat.h>

并在 CMake 脚本中链接如下动态库。

target_link_libraries(entry PUBLIC libnative_media_core.so)

使用OH_PixelmapNative_ConvertPixelmapNativeToNapi()接口将nativePixelMap对象转换为PixelMapnapi对象、OH_PixelmapNative_Release()接口释放OH_PixelmapNative对象资源,需引入如下头文件。

#include <multimedia/image_framework/image/pixelmap_native.h>

并在 CMake 脚本中链接如下动态库。

target_link_libraries(entry PUBLIC libpixelmap.so libpixelmap_ndk.z.so)

开发者使用系统日志能力时,需引入如下头文件。

#include <hilog/log.h>

并需要在 CMake 脚本中链接如下动态库。

target_link_libraries(entry PUBLIC libhilog_ndk.z.so)

开发者通过引入avmetadata_extractor.havmetadata_extractor_base.hnative_averrors.h头文件,使用获取元数据相关API。 详细的API说明请参考AVMetadataExtractor API参考

  1. 使用OH_AVMetadataExtractor_Create()创建实例。

    #include <multimedia/player_framework/avmetadata_extractor.h>
    // 创建OH_AVMetadataExtractor实例。
    OH_AVMetadataExtractor* mainExtractor = OH_AVMetadataExtractor_Create();
    
  2. 设置视频资源的文件描述符:调用OH_AVMetadataExtractor_SetFDSoucre()。 > - 不同AVMetadataExtractor或者AVImageGenerator实例,如果需要操作同一资源,需要多次打开文件描述符,不要共用同一文件描述符。

    #include "napi/native_api.h"
    #include <multimedia/player_framework/avmetadata_extractor.h>
    int64_t offset = 0; // 媒体源在文件描述符中的偏移量。
    int32_t fileDescribe = -1; // 媒体文件描述符。
    int32_t fileSize = 0; // 媒体文件大小。
    
    
    // GetInputParams为辅助函数,用于获取FetchAlbumCover、FetchMetadata的输入参数,实现见完整示例。
    if (!GetInputParams(env, info, offset, fileDescribe, fileSize)) {
        return nullptr;
    }
     // 设置视频资源的文件描述符。
    OH_AVErrCode avErrCode = OH_AVMetadataExtractor_SetFDSource(mainExtractor, fileDescribe, offset, fileSize);
    // 异常处理。
    if (avErrCode != AV_ERR_OK) {
        OH_AVMetadataExtractor_Release(mainExtractor);
        napi_throw_error(env, "EFAILED", "SetFDSource for metadata extractor failed");
        return nullptr;
    }
    
  3. 获取元数据:调用OH_AVMetadataExtractor_FetchMetadata()。 > - 需要先调用OH_AVFormat_Create()函数创建一个OH_AVFormat对象,通过访问该对象的各个键值对,可以获取到元数据。使用完成需要调用OH_AVFormat_Destroy销毁该对象,防止产生内存泄漏,详细使用方法请参阅OH_AVFormat

    // 获取元数据。
    avErrCode = OH_AVMetadataExtractor_FetchMetadata(mainExtractor, avMetadata);
    
  4. (可选)获取专辑封面:调用OH_AVMetadataExtractor_FetchAlbumCover(),可以获取到专辑封面。 > - 使用完成需要调用OH_PixelmapNative_Release释放OH_PixelmapNative对象资源,详细使用方法请参阅Image_NativeModule

    #include <multimedia/image_framework/image/pixelmap_native.h>
    #include <multimedia/player_framework/avmetadata_extractor.h>
    
    
    #include <hilog/log.h>
    // 获取专辑封面。
    OH_PixelmapNative* pixelMap = nullptr;
    avErrCode = OH_AVMetadataExtractor_FetchAlbumCover(mainExtractor, &pixelMap);
    
  5. 释放资源:调用OH_AVMetadataExtractor_Release()销毁实例,释放资源。

    // 释放OH_AVMetadataExtractor资源。
    OH_AVMetadataExtractor_Release(mainExtractor);
    

运行示例工程

参考以下示例,获取一个音频的元数据和专辑封面。

  1. 新建工程,下载完整示例工程,并将示例工程的资源复制到对应目录。 AVMetadataExtractorNDK entry/src/main/ets/ └── pages └── Index.ets (获取元数据界面) entry/src/main/ ├── cpp │ ├── types │ │ └── libentry │ │ └── Index.d.ts (NDK函数对应的js映射) │ ├── CMakeLists.txt (CMake脚本) │ └── napi_init.cpp (NDK函数) └── resources ├── base │ ├── element │ │ ├── color.json │ │ ├── float.json │ │ └── string.json │ └── media │ └── rawfile └── test.mp3 (音频资源)
  2. 编译新建工程并运行。

你可能感兴趣的鸿蒙文章

harmony 鸿蒙Media Kit(媒体服务)

harmony 鸿蒙使用AVImageGenerator提取视频指定时间图像(ArkTS)

harmony 鸿蒙使用AVMetadataExtractor提取音视频元数据信息(ArkTS)

harmony 鸿蒙转码常见问题

harmony 鸿蒙创建异步线程执行AVTranscoder视频转码(ArkTS)

harmony 鸿蒙Media Kit简介

harmony 鸿蒙使用AVPlayer设置播放URL(ArkTS)

harmony 鸿蒙使用AVPlayer播放流媒体(ArkTS)

harmony 鸿蒙使用AVPlayer播放音频(ArkTS)

harmony 鸿蒙使用AVRecorder录制音频(ArkTS)

0  赞