如何在使用 ffmpeg 转换视频时保留音频和字幕流的描述性名称?

如何在使用 ffmpeg 转换视频时保留音频和字幕流的描述性名称?

我使用 ffmpeg 将现有电影转换为 H.265 格式,以减少它们在硬盘中占用的大小。它们大多采用 H.264 编码。为此,我使用以下命令:

ffmpeg -i 1.mkv -c:v libx265 -c:a libmp3lame -b:a 128k -c:s mov_text -map 0 1.mp4

其他文件也一样。但仅保留流的描述性名称是不够的。输入文件中的字幕、视频和音频流的元数据包括它们的语言(例如 eng,英语),但输出文件中缺少这些语言。例如,ffmpeg 将输入音频流的信息输出为:

Stream #0:1(eng): Audio: ...

当我使用 VLC 播放音轨列表中的曲目时,我看到“曲目 1 - [英语]”,但它输出输出音频流的信息如下:

Stream #0:1(und): Audio: ...

VLC 只是将其称为“轨道 1”。我知道我可以通过以下方式将缺少的元数据添加到输出文件中:

ffmpeg -i 1.mp4 -c copy -metadata:s:a:0 language=eng -metadata:s:a:0 handler="English" ...

重新包含它们,但为什么它们会丢失以便稍后再次添加?我需要改进第一个命令,不要省略它们并将它们包含在输出文件中1.mp4

我在第一个命令中遗漏了什么?

答案1

尝试-map_metadata 0像这样添加到您的原始命令:

ffmpeg -i 1.mkv -c:v libx265 -c:a libmp3lame -b:a 128k -c:s mov_text -map 0 `-map_metadata 0 1.mp4

此外,在某些情况下,您似乎应该使用-movflags use_metadata_tags。更多详细信息请参见在这个答案中

相关内容