如何使用 ffmpeg 设置默认流

Posted

技术标签:

【中文标题】如何使用 ffmpeg 设置默认流【英文标题】:How to set default streams with ffmpeg 【发布时间】:2013-07-23 14:13:05 【问题描述】:

我有一些 m4v 文件,我想用 ffmpeg 添加字幕。我知道我需要将流映射到输出文件中,但是如何确保这个字幕流是默认流?字幕是 .srt 并且人们似乎在说它们与 mp4 容器不兼容,我需要先将字幕转换为什么?

另外,各种流的顺序是否重要?视频流总是必须先出现,然后是音频,然后是字幕吗?或者你可以随意混合它们吗?有什么区别吗?

最后,默认流和强制流有什么区别?

【问题讨论】:

【参考方案1】:

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

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

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

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

3.此外,各种流的顺序是否重要?视频流总是必须先出现,然后是音频,然后是字幕吗?或者你可以随意混合它们吗?有什么区别吗?

没有。每个流的类型(视频/音频/字幕/其他)在标头中指定。玩家可以分辨出哪个是哪个。

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

如果您尚未在播放器中设置语言偏好代码(ENG、JAP、SPA、ITA 等),则默认流是播放器默认使用的流。强制流将强制该流,无论您在播放器中指定的设置如何。

【讨论】:

ffmpeg can now 还指定默认流。选项 -disposition:a:1 default 会将第二个音频标记为默认值,但不要忘记从第一个音轨中删除默认标签:例如-disposition:a:0 none 或链接中的其他类型。它将创建原始文件的副本,因此它不是即时更改,就像使用带有 --set flag-default 选项的 mkvpropedit 时一样。 m4v 是 mp4。完全一样的东西。唯一的区别是使用 mp4 文件中的 Quicktime won't play AC3 audio。【参考方案2】:

    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

    顺序不计算在内,您可以反转输入,您可以反转音频/视频和字幕编解码器设置,您将始终有 3 首曲目一起播放。

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

    不确定,但我们在这里为字幕明确设置了编解码器,它可能就是您所说的“强制”。而且有点不同:

    ffmpeg -i input.mp4 output.mp4
    

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

【讨论】:

对不起风格,从 iPhone 格式化答案真的很难! 他们应该为此提供徽章。 我原以为默认/强制流与播放期间的某些内容有关,感谢您的澄清。如果我使用您给出的命令(ffmpeg -i input.mp4 -i subtitles.srt -c:s mov_text -c:v copy -c:a copy output.mp4)一切正常,但是我最初的输出文件为.m4v 文件,它会立即给我一个编解码器错误。我认为 .mp4 和 .m4v 容器是相同的,那么为什么它会给我一个错误但与另一个一起工作? 3:流可以有强制/默认/标签。强制应该总是播放,默认情况下。但它取决于设备/程序中 mpeg 解码器的实现是否注意默认标签,并且是否忽略流的顺序。这适用于所有流:视频/音频/字幕。此外,如果播放设备支持 mp4 内的字幕。默认情况下,某些电视将始终播放第一个流。无论默认标签。 你在使用 m4v 时出错,因为 ffmpeg 不知道使用什么容器。根据输出文件的扩展名选择容器类型。 oufile.mp4 将使用 mp4 容器。但是使用命令 -f 您可以手动指定容器类型并使用非标准输出文件扩展名。 ffmpeg -i input.mp4 -i subtitles.srt -c:s mov_text -c:v copy -c:a copy -f mp4 output.m4v

以上是关于如何使用 ffmpeg 设置默认流的主要内容,如果未能解决你的问题,请参考以下文章

FFmpeg命令读取RTMP流如何设置超时时间

使用ffmpeg编码时,如何设置恒定码率,并控制好关键帧I帧间隔

我们如何使用 ffmpeg 将实时 rtmp 流转码为实时 hls 流?

如何将 ffmpeg 流中的音频传输到 nginx rtmp 服务器?

如何使用ffmpeg实现h264流传输+H264实现RTP传输数据

关于ffmpeg推流,如何推流一个文件夹里的所有视频或者多个视频?