最佳 ffmpeg 标志可确保混合和转码过程的可移植性

最佳 ffmpeg 标志可确保混合和转码过程的可移植性

我负责一款软件的维护,该软件用于ffmpeg自动将两个输入流混合和转码为具有视频和音频轨道的单个输出。我目前面临一些可移植性问题,并希望改进我的使用方法,ffmpeg以确保我的应用程序尽可能具有可移植性:

  • 适用于几乎所有操作系统和发行版
  • 可与旧版 ffmpeg 兼容(debian squeeze 仍然使用 ffmpeg 0.5.10)

我的第一个源是 FLV 或 mp4 文件。它包含两个流:音频和视频。我不关心视频,它不包含在最终文件中。

第二个来源是 PNG 或 JPG 图像列表。它们将用于创建视频流image2

输出必须是一个包含两个流的文件:音频和视频。我对容器、音频编解码器和视频编解码器没有很强的要求。它们只需要在任何操作系统/设备上都可以轻松使用。我想尽可能地保留音频质量。视频流只是一组静态幻灯片。最小化输出文件的大小会很棒。

根据此描述,您将使用哪些标志/容器/编解码器?


当前流程的描述如下:

  1. 从第一个源中提取音轨

    ffmpeg -v error -i source_1_path -vn -acodec libvorbis audio_track.ogg
    
  2. 创建最终文件

    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自行打包

如果有人使用ffmpeg0.5.10,那么如果出现问题,你真的不应该受到指责。命令出现问题的首要原因ffmpeg(至少从我的经验来看)是版本过时。从 0.5 到最近的 1.2,有数千个已修复的错误和数百个新功能。最值得注意的是,他们更改(并删除)了一些命令行选项,这会破坏一些工作流程。

请注意,Ubuntu 由于在某些情况下,实际上并未使用ffmpegFFmpeg 项目,但实际上使用了 Libav 的avconv。在较新版本的 Ubuntu 中,情况就是这样。旧版本的 Ubuntu 仍然提供ffmpeg来自 Libav 的二进制文件,它已经损坏且过时,但人们仍然认为它来自 FFmpeg。底线:您不能也不应该相信您的用户ffmpeg在他们的系统上有一个可以工作的二进制文件。

许多项目都包含部分 FFmpeg 工具,你可以加入静态构建如果这不是法律问题(我不是律师,所以请检查)。我在这里看到的唯一缺点是旧内核可能无法运行所有静态版本。


话虽如此,以下是应该在任何地方都有效的命令,前提是ffmpeg已编译libx264libmp3lame启用。您原来的命令无法可靠地工作因为 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,但是旧的别名仍然有效。

相关内容