zoukankan      html  css  js  c++  java
  • 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
    ", 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

  • 相关阅读:
    NoClassDefFoundError问题
    Spring-Batch处理MySQL数据后存到CSV文件
    jQuery EasyUI + struts2.3 + mongoDB 列表查询翻页JAVA样例
    mongodb exception in initAndListen: 12596 old lock file, terminating 解决方法
    硬盘安装RedHat Enterprise Linux 6(转载)
    jQuery zxxbox弹出框插件(v3.0)
    在html页面中利用ftp访问协议格式载入服务器图片
    eclipse中 com.sun.image.codec.jpeg.JPEGCodec 无法编译通过问题
    java 去掉字符串右侧空格
    去掉eclipse js 错误提示
  • 原文地址:https://www.cnblogs.com/yongdaimi/p/14121092.html
Copyright © 2011-2022 走看看