如何用C++通过FFmpeg向MP4文件写入自定义元数据?
解决MP4文件写入自定义元数据的问题
你遇到的问题根源在于MP4格式的元数据有固定的标准字段映射规则:FFmpeg默认只会将title这类标准元数据字段写入到MP4对应的标准原子中(比如title对应MP4的©tit原子),而自定义字段直接用普通键名时,FFmpeg不会自动处理并写入到MP4文件结构里,导致Windows属性面板无法识别。
下面是两种可行的代码解决方案:
方案一:使用MP4专属自定义元数据格式
通过在自定义键名前添加mp4udta:前缀,告诉FFmpeg将该字段写入MP4的用户自定义数据(UDTA)原子中:
AVFormatContext *outContext; // 注意键名前缀mp4udta: av_dict_set(&outContext->metadata, "mp4udta:random", "Cloud Recording", 0); avformat_write_header(outContext, nullptr);
方案二:写入XMP通用元数据
XMP是跨平台的通用元数据标准,Windows属性面板也能识别XMP中的自定义字段(需要FFmpeg编译时启用XMP支持,通常依赖libxml2)。只需在键名前添加xmp:前缀:
AVFormatContext *outContext; // 键名前缀xmp: av_dict_set(&outContext->metadata, "xmp:random", "Cloud Recording", 0); avformat_write_header(outContext, nullptr);
验证方法
可以用FFmpeg的ffprobe工具验证元数据是否写入成功:
ffprobe -show_format -print_format json your_video.mp4
在输出的format.metadata节点中,应该能看到你添加的random字段(或带前缀的对应字段)。
另外,写入完成后可能需要刷新Windows资源管理器,或重新打开文件属性面板才能看到更新后的元数据。
内容的提问来源于stack exchange,提问作者Sourav Dey
相关产品推荐
相关产品推荐

