FFmpeg: 利用FFmpeg提取音频文件中的metadata
FFmpeg可以读取音频文件的metadata, 比如在命令行执行下列指令:
实际编码的时候可以下列方式:
AVDictionaryEntry *tag = nullptr; while ((tag = av_dict_get(m_input_format_ctx->metadata, "", tag, AV_DICT_IGNORE_SUFFIX))) { XLOGI("[MetaData]: %s = %s\n", tag->key, tag->value); if (!strcasecmp(tag->key, kMetadataTitleKey)) { size_t value_len = strlen(tag->value); size_t copy_len = (value_len > sizeof(metadata_title) - 1) ? sizeof(metadata_title) - 1 : value_len; strncpy(metadata_title, tag->value, copy_len); } if (!strcasecmp(tag->key, kMetadataAlbumKey)) { size_t value_len = strlen(tag->value); size_t copy_len = (value_len > sizeof(metadata_album) - 1) ? sizeof(metadata_album) - 1 : value_len; strncpy(metadata_album, tag->value, copy_len); } if (!strcasecmp(tag->key, kMetadataArtistKey)) { size_t value_len = strlen(tag->value); size_t copy_len = (value_len > sizeof(metadata_author) - 1) ? sizeof(metadata_author) - 1 : value_len; strncpy(metadata_author, tag->value, copy_len); } }
输出:
2020-12-11 16:15:28.466 10926-10984/com.realsil.android.audioconvert I/xp-jni: [MetaData]: encoder = Lavf57.71.100
2020-12-11 16:15:28.466 10926-10984/com.realsil.android.audioconvert I/xp-jni: [MetaData]: album = DOTA2音乐包合集
2020-12-11 16:15:28.466 10926-10984/com.realsil.android.audioconvert I/xp-jni: [MetaData]: title = [雷神之管]ui_main
2020-12-11 16:15:28.466 10926-10984/com.realsil.android.audioconvert I/xp-jni: [MetaData]: artist = HAHAWTF
2020-12-11 16:15:28.466 10926-10984/com.realsil.android.audioconvert I/xp-jni: [MetaData]: comment = 163 key(Don't modify):6YURAByiRHQ6CI5tvtxzQg==
上面定义了一个while循环通过不断的调用 av_dict_get() 函数从 AVFomratContext->metadata上获得音频的元数据,写法参照了ffmpeg example中的示例,需要注意的主要有一点,就是各个音频文件里的元数据的key可能是不一样的,有些名字一样,但是需要区分大小写,所以我在上面的code中使用了 strcasecmp() 函数来忽略key的大小写问题。另外key的值虽然不同,但是大多数文件都是这样定义的:
static const char *kMetadataAlbumKey = "album"; // 代表专辑名
static const char *kMetadataTitleKey = "title"; // 代表音频文件的标题
static const char *kMetadataArtistKey = "artist"; // 艺术家(演唱者)
FFmpeg 官网Demo: https://github.com/FFmpeg/FFmpeg/blob/master/doc/examples/metadata.c
如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
2019-12-11 eclispe: 修改所有文件默认编码为UTF-8
2017-12-11 管道相关函数(1)-pipe
2017-12-11 android.graphics(1) - Paint, Canvas, drawLine, drawPoint, drawRect, drawRoundRect, drawCircle, drawOval, drawArc