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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM