我负责一款软件的维护,该软件用于ffmpeg
自动将两个输入流混合和转码为具有视频和音频轨道的单个输出。我目前面临一些可移植性问题,并希望改进我的使用方法,ffmpeg
以确保我的应用程序尽可能具有可移植性:
- 适用于几乎所有操作系统和发行版
- 可与旧版 ffmpeg 兼容(debian squeeze 仍然使用 ffmpeg 0.5.10)
我的第一个源是 FLV 或 mp4 文件。它包含两个流:音频和视频。我不关心视频,它不包含在最终文件中。
第二个来源是 PNG 或 JPG 图像列表。它们将用于创建视频流image2
。
输出必须是一个包含两个流的文件:音频和视频。我对容器、音频编解码器和视频编解码器没有很强的要求。它们只需要在任何操作系统/设备上都可以轻松使用。我想尽可能地保留音频质量。视频流只是一组静态幻灯片。最小化输出文件的大小会很棒。
根据此描述,您将使用哪些标志/容器/编解码器?
当前流程的描述如下:
从第一个源中提取音轨
ffmpeg -v error -i source_1_path -vn -acodec libvorbis audio_track.ogg
创建最终文件
ffmpeg -v error -f image2 -r 1 -i frame_pattern.jpg -i audio_track.ogg output.avi
我以为 ffmpeg 会自动使用最合适的音频/视频编解码器和设置。不幸的是,它在某些 Linux 发行版上失败了([ac3 @ 0x1e60380] invalid bit rate
例如0.8.6-6:0.8.6-0ubuntu0.12.10.1
)。
显然,一次性完成要比创建临时音轨更好。
答案1
ffmpeg
版本和ffmpeg
自行打包
如果有人使用ffmpeg
0.5.10,那么如果出现问题,你真的不应该受到指责。命令出现问题的首要原因ffmpeg
(至少从我的经验来看)是版本过时。从 0.5 到最近的 1.2,有数千个已修复的错误和数百个新功能。最值得注意的是,他们更改(并删除)了一些命令行选项,这会破坏一些工作流程。
请注意,Ubuntu 由于在某些情况下,实际上并未使用ffmpeg
FFmpeg 项目,但实际上使用了 Libav 的avconv
。在较新版本的 Ubuntu 中,情况就是这样。旧版本的 Ubuntu 仍然提供ffmpeg
来自 Libav 的二进制文件,它已经损坏且过时,但人们仍然认为它来自 FFmpeg。底线:您不能也不应该相信您的用户ffmpeg
在他们的系统上有一个可以工作的二进制文件。
有许多项目都包含部分 FFmpeg 工具,你可以加入静态构建如果这不是法律问题(我不是律师,所以请检查)。我在这里看到的唯一缺点是旧内核可能无法运行所有静态版本。
话虽如此,以下是应该在任何地方都有效的命令,前提是ffmpeg
已编译libx264
并libmp3lame
启用。您原来的命令无法可靠地工作因为 Vorbis 音频在 AVI 中存在问题,并且自动为 AVI 选择的 AC3 编码器可能会阻塞某些输入。另外,您会将音频从 Vorbis 重新编码为 AC3,这会降低质量。
将音频提取为 MP3
最好导出为 MP3 音频,例如使用 320 kBit/s CBR 或 VBR 为 4(LAME 的-V
等效值)。后者可能由于后缀的原因在旧版本上不起作用:a
。
ffmpeg -v error -i source_1_path -vn -acodec libmp3lame -ab 320k audio_track.mp3
ffmpeg -v error -i source_1_path -vn -acodec libmp3lame -q:a 4 audio_track.mp3
与H.264视频结合
为了合并,我们将使用 x264 视频(H.264 编码器):
ffmpeg -v error -f image2 -r 1 -i frame_pattern.jpg -i audio_track.mp3 \
-acodec copy -vcodec libx264 output.mp4
在这里您只需复制音频流,而不必ffmpeg
重新编码。这将帮助您保留原始质量。
至于视频,请注意并非所有设备都可以直接播放 H.264。有些设备可能只能使用基线配置文件播放 H.264,这是-profile:v baseline
在较新的版本中设置的ffmpeg
,或者-vprofile baseline
在 0.7 左右的某些版本中(不确定是哪个……当时没有记录),-vpre baseline
或者使用内部预设的非常旧的版本而不是依赖 x264 编码器库。
替代方案:与 MPEG-4 视频结合
如果 H.264 不是一个选项,您可以尝试 MPEG-4 Part II 视频 - 这里设置 2 MBit/s 比特率-vb
:
ffmpeg -v error -f image2 -r 1 -i frame_pattern.jpg -i audio_track.mp3 \
-acodec copy -vcodec mpeg4 -vb 2M output.mp4
现在应该可以使用该选项-b:v
,但是旧的别名仍然有效。