写入 M4A 元数据的结果好坏参半

写入 M4A 元数据的结果好坏参半

鉴于此文件:

youtube-dl -f 140 -o in.m4a --fixup warn https://youtube.com/watch?v=j-70HbaR4g4

我在编写元数据时遇到了好坏参半的结果。例如以下命令:

ffmpeg -i in.m4a -c copy in.mp4
ffmpeg -i in.mp4 -c copy good.aac
ffmpeg -i good.aac -c copy -bsf aac_adtstoasc -metadata title=Confetti `
   -movflags faststart good.m4a

将生成一个可正确播放且元数据可识别的 M4A 文件。但是此命令:

ffmpeg -i in.m4a -c copy -movflags faststart -metadata title=Confetti bad.m4a

生成一个可以正确播放的文件,但我的播放器无法识别元数据。另外,我记得我几年前就研究过这个问题,我想我知道问题的一部分。我通过mp4dump[1] 运行了这两个文件,我注意到了差异。这是好文件:

[moov] size=8+41912
  [trak] size=8+41666
    [mdia] size=8+41530
      [minf] size=8+41445
        [stbl] size=8+41385
          [stsd] size=12+91
            [mp4a] size=8+79
              [esds] size=12+39
                [ESDescriptor] size=5+34
                  [DecoderConfig] size=5+20
                    DecoderSpecificInfo = 12 10 

和坏文件:

[moov] size=8+41976
  [trak] size=8+41730
    [mdia] size=8+41594
      [minf] size=8+41483
        [stbl] size=8+41423
          [stsd] size=12+105
            [mp4a] size=8+93
              [esds] size=12+53
                [ESDescriptor] size=5+48
                  [DecoderConfig] size=5+34
                    DecoderSpecificInfo = 12 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 

如果您注意到,坏文件在 下有更多字节DecoderSpecificInfo。但是,FFmpeg 似乎只是从原始文件中复制该信息。如果 FFmpeg 有办法直接丢弃该数据,那就太理想了。本质上,我认为这就是我的“好”命令所做的,但如果能够在一个命令中完成它就更好了。

  1. https://bento4.com/documentation/mp4dump

答案1

当您将音频流提取/转换为“原始 AAC”(ADTS)时,源文件的元数据将被丢弃,因为它仅包含最小的标题。

要无需额外步骤即可删除元数据,您可以执行以下操作:

ffmpeg -i in.m4a -c copy -map_metadata -1 out.m4a

开关的负文件索引-map_metadata禁用元数据的复制(顺便说一下,它不包括章节;这是-map_chapters为此而设的)。

该开关不应阻止您在同一进程中创建新的元数据项,因此您可以-metadata title=Confetti在其后添加。

我无法说出究竟是什么阻止您使用的特定播放器识别源中的元数据(或者可能只是输出中的元数据副本),但由于显然“从头开始”创建元数据对它有效,并且您要求的是简化的方法,所以这就是答案。

答案2

根据 Tom 的回答,我认为我能够解决这个问题。如果我运行以下命令:

ffmpeg -i in.m4a -c copy -movflags faststart -metadata title=Confetti bad.m4a
ffmpeg -i in.m4a -c copy -movflags faststart -metadata title=Confetti `
   -map_metadata -1 good.m4a
mp4dump bad.m4a > bad.txt
mp4dump good.m4a > good.txt
git diff bad.txt good.txt

我得到这个结果:

-        handler_name = ISO Media file produced by Google Inc.
+        handler_name = SoundHandler

我又测试了一些,handler_name似乎29 个字符 将会失败,这可能是 30(包括一个空字节),也可能是一个长度字节。下面是一个勉强通过的示例:

ffmpeg -i in.m4a -c copy -movflags faststart -metadata title=Confetti `
-metadata:s handler_name=SoundHandlerSoundHandlerSound good.m4a

相关内容