当前位置: 首页 > article >正文

FFmpeg 元数据

文章目录

  • 元数据
    • 代码实例,查看元数据

元数据

在处理音视频文件时,了解其元数据信息是非常重要的。元数据是描述文件内容和属性的数据,包括了诸如标题、作者、时长、分辨率等信息。

使用ACDictonary API,可以查看元数据或者将元数据写入到AVFormatContext,AVStream,AVChapter和AVProgram结构体中,元数据保存在它们Metadata字段中。元数据是由一个键值对组成的。与FFmpeg中的所有字符串一样,元数据被假定为UTF-8编码的Unicode。请注意,在大多数情况下,demuxers导出的元数据不会检查字符串是否是有效的UTF-8。

需要记住的重要概念:

  • KEY是唯一的,不能存在相同的键。即一个demuxer不应该故意产生几个字面上不同但语义上相同的键。
  • 元数据是平面的,不是分层的,没有子标签。如果你想存储,例如,制片人Alice和演员Bob的孩子的电子邮件地址,可以有key=alice_and_bobs_childs_email_address。
  • 可以将几个修饰符应用于标记名。这是通过添加一个破折号(‘-’)和修饰符名称,按照它们在下面的列表中出现的顺序来完成的。例如foo-eng-sort,而不是foo-sort-eng。
    • language:标记的值被本地化为特定的语言并附加ISO 639-2/B 3个字母的语言代码。例如:Author_get=Michael,Author_eng=Mike,原始/默认语言在非限定的Author标签中,如果demuxer设置了任何已翻译的标记,它应该设置一个默认值。
    • sort:应该用于排序的标记修改版本将附加-sort,例如:artist=“The Beatles”,artist-sort = “Beatles,The”。
  • 一些协议和demuxers支持元数据更新。在成功调用av_read_frame()之后,AVFormatContext.event_flags或AVStream.event_falgs将被更新以指示元数据是否修改。为了检测流上的元数据变化,你需要循环遍历AVFormatContext中的所有流,并检查它们各自的event_flags。
  • Demuxers视图以通用格式导出元数据,但没有通用等价物的标记会被保留u,因为它们存储在容器中。下面是一个通用标签名称列表:
    标签描述
    album该作品所属的专辑名称
    album_artist如果与艺术家不同,则为专辑/合辑的主要创作者
    artist作品的主要创作者
    comment文件的任何附加描述
    composer如果与艺术家不同,则为作品的作曲家
    copytight版权持有者的名称
    creation_time文件创建的日期,最好以ISO 8601格式表示
    date创作日期
    disc子集的数量
    encoder生成文件的软件/硬件的名称/设置
    encoded_by创建文件的个人/团体
    filename文件的原始名称
    genre音乐流派
    language作品的主要表演语言,可以通过逗号分隔多个语言
    performer如果与艺术家不同,则为表演作品的艺术家
    publisher标签/发布者的名称
    service_name广播中的服务名称(频道名称)
    service_provider广播中的服务提供商名称
    title作品的名称
    track该作品在集合中的编号,可以是当前/总数的形式
    variant_bitrate当前流所属的比特率变体的总比特率

代码实例,查看元数据

void Widget::getMetaData()
{
    char *err = nullptr;                               // 错误信息
    const char *input_file = "../../source/audio.mp3"; // 输入文件路径
    AVFormatContext *fmt_ctx = nullptr;                // 文件格式上下文
    const AVDictionaryEntry *m = nullptr;              // 字典项

    // 打开输入文件
    int ret = avformat_open_input(&fmt_ctx, input_file, nullptr, nullptr);
    if (ret < 0)
    {
        av_strerror(ret, err, sizeof(err));
        qDebug() << "打开输入文件失败: " << err;
        return;
    }

    // 查找流信息
    ret = avformat_find_stream_info(fmt_ctx, nullptr);
    if (ret < 0)
    {
        av_strerror(ret, err, sizeof(err));
        qDebug() << "查找流信息失败: " << err;
        return;
    }

    // 输出元数据
    while (m = av_dict_get(fmt_ctx->metadata, "", m, AV_DICT_IGNORE_SUFFIX))
    {
        qDebug() << m->key << ": " << m->value;
    }

    avformat_close_input(&fmt_ctx);
}

运行结果如下:
在这里插入图片描述


http://www.kler.cn/a/506548.html

相关文章:

  • 【C++篇】红黑树的实现
  • 自定义注解使用AspectJ切面和SpringBoot的Even事件优雅记录业务接口及第三方接口调用日志实现思路
  • @NotNull、@NotBlank 和 @NotEmpty 注解的区别
  • 工业过程自动化技术:控制系统、传感器、互联网、AI通信
  • Excel 技巧10 - 如何检查输入重复数据(★★)
  • [Qt]常用控件介绍-容器类控件-QGroupBox、QTabWidget
  • Bootstrap UI 编辑器
  • vue3里面,事件触发一次,方法执行多次
  • 通过ssh连接debian
  • Redis :redis的大Key问题
  • 复盘思维课程
  • Spring MVC核心组件与请求处理流程
  • BertTokenizerFast 和 BertTokenizer 的区别
  • 探索 AI 自动化编程:效率革命与未来教育的转型
  • Java 对象池管理的高性能工具库 Apache Commons Pool 2
  • 2.两数相加--力扣
  • tomcat文件目录讲解
  • 剑指Offer|LCR 031. LRU 缓存
  • Haskell语言的网络编程
  • 基于 Electron 应用的安全测试基础 — 提取和分析 .asar 文件