鉴于此文件:
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
当您将音频流提取/转换为“原始 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