如何使用ffmpeg设置默认流

5
我有一些m4v文件,想要使用ffmpeg添加字幕。我知道我需要映射流以将它们放入输出文件中,但如何确保这个字幕流是默认的呢?字幕是.srt格式的,人们似乎在说它们与mp4容器不兼容,那么我需要先将字幕转换成什么格式?
另外,各种流的顺序是否重要?视频流总是必须先来,然后是音频,再是字幕吗?或者你可以随意混合它们吗?这会有任何影响吗?
最后,一个默认流和一个强制流之间有什么区别?
2个回答

2

1. 我有一些m4v文件,想用ffmpeg添加字幕。

m4v是苹果模仿非特定平台的MP4标准而制作的格式。我不太了解这种苹果格式,但像大多数旧的容器格式一样,我怀疑它可能只支持音频/视频或对字幕的支持较差或有限。

2. 字幕格式是.srt,人们似乎在说它们不兼容mp4容器,我需要先将字幕转换为什么格式?

您可以使用AegisSub或Gaupol等工具转换字幕。然而,我的建议是使用MKVMerge工具来生成MKV文件容器,这是一个设计用于支持各种不同流(包括几乎所有类型的字幕、字体和附件)的容器格式。MKVmerge还允许您指定默认流。

3. 此外,各种流的顺序是否重要?视频流总是先于音频,然后是字幕吗?或者您可以随意混合它们吗?这会有任何影响吗?

不会。每个流的类型(视频/音频/字幕/其他)都在头部中指定。播放器会找出哪个是哪个。

4. 最后,默认流和强制流之间有什么区别?

默认流是您的播放器在您没有设置语言首选项代码(ENG、JAP、SPA、ITA等)时默认使用的流。强制流将无论您在播放器中指定的设置如何都强制使用该流。


5
FFmpeg现在可以指定默认流。选项“-disposition:a:1 default”将标记第二个音频为默认,但不要忘记从第一轨道中删除默认标记:例如,“-disposition:a:0 none”或链接中的另一种类型。它会创建原始文件的副本,因此不像使用带有--set flag-default选项的mkvpropedit那样是即时更改。 - papo
1
m4v就是mp4,完全一样的东西。唯一的区别是在使用Quicktime播放mp4文件时,无法播放AC3音频。 - papo

1
  1. SRT文件可以作为FFmpeg的输入,以在MP4容器中进行混音。没有兼容性问题。

    ffmpeg -i input.mp4 -i subtitles.srt -c:s mov_text -c:v copy -c:a copy output.mp4
    

    这里针对MP4需要指定字幕编解码器 mov_text

  2. 顺序不重要,你可以颠倒输入,可以颠倒音频/视频和字幕编解码器设置,最终总是会有三个轨道一起播放。

    ffmpeg -i subtitles.srt -i input.mp4 -c:s mov_text -c:a copy -c:v copy output.mp4
    
  3. 不确定,但在这里我们明确设置了字幕编解码器,可能是您所说的“强制”。而且与以下命令略有不同:

    ffmpeg -i input.mp4 output.mp4
    

    这里FFmpeg将使用其“默认流类型”或编解码器输出到MP4。


1
很抱歉,由于使用iPhone回答,样式和格式可能不太好! - alexbuisson
2
他们应该为此颁发一个徽章。 - llogan
我曾经认为默认/强制流与播放过程中的某些内容有关,感谢您的澄清。如果我使用您提供的命令(ffmpeg -i input.mp4 -i subtitles.srt -c:s mov_text -c:v copy -c:a copy output.mp4),一切都很顺利,但是最初我将输出文件设置为.m4v文件,它会立即给我一个编解码器错误。我以为.mp4和.m4v容器是相同的,那么为什么一个会给我一个错误,而另一个却可以工作呢? - sion
3:流可以有强制/默认/<更多>标签。强制应该始终播放,而默认情况下则是默认的。但这取决于设备/程序内部的MPEG解码器的实现是否遵守默认标记以及是否忽略流的顺序。这适用于所有流:视频/音频/字幕。此外,如果播放设备支持MP4中的字幕。一些电视机将始终按默认方式播放第一个流。无论默认标记如何。 - papo
1
您在使用m4v时遇到错误,因为ffmpeg不知道要使用哪种容器。容器类型是根据输出文件的扩展名选择的。outfile.mp4将使用mp4容器。但是通过使用命令-f,您可以手动指定容器类型并使用非标准的输出文件扩展名。ffmpeg -i input.mp4 -i subtitles.srt -c:s mov_text -c:v copy -c:a copy -f mp4 output.m4v - papo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接