Linux 上的高级视频编码
H.264 对数字视频压缩领域的影响正在增长。像 Apple 这样的公司已经全心全意地转向它。作为 MPEG-4 标准(第 10 部分)的一部分,H.264 现在是高清 DVD 的 HD-DVD 和蓝光规范的一部分。这是有充分理由的——H.264 可以使用非常低的比特率对视频进行编码,同时保持令人难以置信的高感知质量。
特别令人感兴趣的是这种视频编解码器提供的低比特率可能性。对于那些运行 Linux 的人来说幸运的是,H.264 编解码器(也称为高级视频编解码器或 AVC)有一个成功且有效的开源实现,称为 x264。事实上,x264 项目赢得了 Doom9 2005 编解码器比较测试(参见在线资源)。x264 继续取得进展和改进,并且仍然是一个活跃的项目。因此,让我们利用它为我们提供的优势:一个非常高质量的 AVC 编码工具,可以立即用于 DVD 和家庭电影备份,创建用于在 Web 上流式传输的视频剪辑,或者仅仅用于试验最新的视频编码技术。
本文的其余部分侧重于创建包含 H.264 视频和 AAC 音频(高级音频编解码器,也是 MPEG 标准)的标准 .mp4 文件的基本步骤。硬核视频编码的各种复杂性和细微之处超出了本文的讨论范围。但希望这个介绍能鼓励您进一步探索这个主题。
由于 AVC 和 AAC 现在都是 MPEG 标准,因此有理由相信已经有许多工具(商业的和其他的)支持它。例如,Apple 的 QuickTime 原生支持我们将要创建的视频文件。而且,著名的成功开源媒体播放器 MPlayer 也支持 .mp4 播放。
创建符合标准的视频文件涉及三个基本步骤:创建编码视频、创建编码音频以及将这两者结合起来。以下是我们需要的软件工具
MPlayer(包括 mencoder,cvs 版本 060109 或更高版本)
faac 1.24 或更高版本
MP4Box(gpac 0.4.0 或更高版本的一部分)
x264(编译时带有 gpac 支持)
我们的目标是生成一个适合发布在 Web 上的低比特率视频文件。它将是一个小文件,但与更高比特率的 XviD 编码相比,质量将非常出色。我们的源视频将是一个名为 max.dv 的家庭电影剪辑,这是一个九秒钟的原始 DV 文件,直接从数字摄像机捕获。
让我们首先处理音频,因为这是一个非常简单的操作。我们的想法是首先让 MPlayer 直接从我们的视频源转储原始 pcm 音频
mplayer -ao pcm -vc null -vo null max.dv
这将生成一个名为 audiodump.wav 的文件。源文件的视频部分被忽略。现在,将此 wave 文件编码为 AAC
faac --mpeg-vers 4 audiodump.wav
--mpeg-vers 参数指定 MPEG 版本。我们现在完成了音频部分的工作,可以通过使用 MPlayer 播放 audiodump.aac 来收听它。
在视频编码方面,我们面临着多种选择。只有使用多次编码才能获得最高质量的编码。我们实际上对源视频进行两次(或多次)处理,以便编码器能够选择目标文件中比特的最佳可能分布。使用多次编码还使我们能够精确定位输出的比特率和结果文件大小。然而,使用 AVC 编码器(如 x264)进行编码是非常消耗处理器的,因此可能会运行得很慢,因此我们可能不想坐等漫长的多次编码。相反,我们可以使用一次编码运行编码。这仍然会产生出色的结果,但永远不如多次编码好。我们也放弃了针对结果文件大小和比特率的可能性。这一切都取决于对您来说最重要的是时间还是质量。
幸运的是,x264 提供了一个很好的中间地带。存在一个选项可以指定恒定速率因子(或恒定质量),它指示 x264 考虑高运动和低运动场景之间的差异。因为您的眼睛无论如何都会在高运动场景中丢失细节,所以 x264 在这些位置使用更少的比特,以便它可以将它们分配到其他地方,从而大大提高整体视觉质量。这种模式允许在不使用多次编码的情况下获得可能的最高质量,这是一个非常节省时间的方法。但是,使用这种模式的代价是放弃了确定最终文件大小和比特率的能力。虽然这可以通过多次编码实现,但我们将被迫将编码时间加倍。因此,对于我们的示例,让我们坚持一次编码,利用恒定速率因子功能 (--crf) 来显着提高质量。恒定速率因子的良好值范围大约在 18 到 26 之间(较低的值产生更高的质量但更大的文件大小)。然而,您在大小与时间与质量方面的需求可能有所不同。如果是这样,您应该进一步研究多次编码模式以获得更多控制。
x264 编码器仅接受原始 YUV 4:2:0 输入。为此,只需将 mencoder 的输出直接管道传输到 x264
mkfifo tmp.fifo.yuv mencoder -vf format=i420 -nosound -ovc raw -of rawvideo \ -ofps 23.976 -o tmp.fifo.yuv max.dv 2>&1 > /dev/null & x264 -o max-video.mp4 --fps 23.976 --crf 26 --progress \ tmp.fifo.yuv 720x480 rm tmp.fifo.yuv
正如您所见,我们必须指定帧率 (--fps);否则 x264 将不知道输入的是什么。对传入原始视频的宽度和高度也进行类似操作。以这种方式编码启用 x264 默认编码参数,这些参数非常好,但我们可以进行一些改进。特别是,我们可以对它使用的一些编码策略进行一般性改进,而不会过多地牺牲额外的编码时间。您可以输入到 x264 中的参数的数量和可变性非常大,它们都旨在以某种方式提高结果输出的质量。然而,某些选项比其他选项更昂贵,在时间和处理器方面。而且,某些选项可能会牺牲与某些媒体播放器(尤其是 QuickTime)的兼容性。为了保持与现有 QuickTime 用户安装基础的兼容性,我们需要记住一些事项。
QuickTime 7 支持 H.264 编码视频,这真是太好了。Apple 本身使用 H.264 对其所有在线电影预告片进行编码。虽然这很好,并促进了这种编解码器的采用,但 QuickTime 实现有一些限制,最值得注意的是 B 帧和配置文件支持。我们需要简短地绕道解释一下这对我们的编码项目意味着什么。
H.264 的 MPEG 标准包括许多配置文件,例如 Baseline、Main、Extended 和 High。这些配置文件描绘了解码器可能需要具备的不同技术能力。顾名思义,Baseline 配置文件是最简单和要求最低的配置文件,而 Main、Extended 和 High 需要更多的处理能力和对更多技术特征的解释才能正确解码。QuickTime 7 支持 Baseline 和 Main 配置文件的部分功能;但是,它在 Extended 和 High 配置文件的功能上会卡住。
B 帧是数字视频的一种存储格式类型。这些类型的帧引用来自其他先前解码帧的信息,以便解码器正确完成其工作,即解码视频。B 帧与其他帧类型(称为 I 帧和 P 帧)交错。这是一个技术细节,但 QuickTime 7 H.264 解码器最多只能支持两个 B 帧,不能再多。这很不幸,因为在某些情况下,使用更多 B 帧可以让我们提高质量。
为了保持 QuickTime 兼容性,我们需要牢记这些限制。然而,即使存在这些限制,我们的低比特率编码的质量也不会受到太大影响。而且,我们可以启用一些额外的选项来显着改进效果。第一个是子像素运动估计 (--subme) 大小,它控制 x264 在编码过程中使用的运动估计计算的精度。通过将其增加到最大值 6,我们以增加一些额外的编码时间为代价获得了大量的视觉质量,但这很值得。我们还可以配置 x264 如何分析帧以执行更好的运动估计 (--analyse),这会导致更高质量的编码。请注意,某些类型的分析仅适用于 High 配置文件编码,例如 8x8 DCT,QuickTime 不支持这些设置,因此我们避免使用这些设置。我们还可以禁用 PSNR 计算 (--no-psnr) 以在编码期间节省一些速度。PSNR 只是质量测量,对实际编码质量没有影响。
将所有这些放在一起,我们现在可以使用 H.264 输出高质量、低比特率、QuickTime 兼容且符合标准的视频编码
mkfifo tmp.fifo.yuv mencoder -vf format=i420 -nosound -ovc raw -of \ rawvideo -ofps 23.976 -o tmp.fifo.yuv \ max.dv 2>&1 > /dev/null & x264 -o max-video.mp4 --fps 23.976 --bframes 2 \ --progress --crf 26 --subme 6 --analyse \ p8x8,b8x8,i4x4,p4x4 --no-psnr tmp.fifo.yuv 720x480 rm tmp.fifo.yuv
我们可以做进一步的改进。由于此视频文件是用于 Web 的,因此我们很可能希望将帧大小减小到更友好的尺寸,可能裁剪掉不需要的区域,并进行其他调整。例如,要减小帧大小,请运行以下命令
mkfifo tmp.fifo.yuv mencoder -vf scale=480:320,format=i420 -nosound -ovc \ raw -of rawvideo -ofps 23.976 -o tmp.fifo.yuv \ max.dv 2>&1 > /dev/null & x264 -o max-video.mp4 --fps 23.976 --bframes 2 \ --progress --crf 26 --subme 6 --analyse \ p8x8,b8x8,i4x4,p4x4 --no-psnr tmp.fifo.yuv 480x320 rm tmp.fifo.yuv
在这里,我们指示 mencoder 将输出缩放到 480x320,并告诉 x264 接受该帧大小。这将进一步减小文件大小,这对于 Web 上的视频是合适的。
基于 QuickTime 格式,.mp4 容器格式可以存储多种类型的媒体,并且也是用于存储 H.264 视频和 AAC 音频的 MPEG 标准,这就是我们将要使用它的方式。使用 MP4Box(gpac 项目的一部分)来组合我们刚刚创建的音频和视频流
MP4Box -add max-video.mp4 -add audiodump.aac \ -fps 23.976 max-x264.mp4
这将生成最终输出文件 max-x264.mp4。您可以使用 MPlayer 或 Apple 的 QuickTime 播放器在非 Linux 操作系统上播放该文件。您还可以使用 Apple 的嵌入 QuickTime 电影的说明(请参阅资源)将此文件嵌入到网页中以从浏览器播放。诸如 mplayer-plugin 之类的免费软件工具可用于从 Linux 上的 Firefox 中播放此文件。
为了进行比较,以下是原始原始 DV 文件 max.dv、我们的 H.264 编码文件 max-x264.mp4 以及从同一源视频创建的相应 XviD 编码 max-xvid.avi 的文件大小和比特率(请参阅资源)
mencoder max.dv -vf scale=480:320 -ovc xvid -xvidencopts \ fixed_quant=7:qpel:nopacked -oac mp3lame \ -ofps 24000/1001 -o max-xvid.avi
以下是每个样本的随附屏幕截图。



图 1. DV



图 2. XviD



图 3. x264
正如您所见,H.264 编码文件的视觉质量与 XviD 版本一样高,甚至可以说更高,但比特率和文件大小更低。这表明,与 XviD 等其他编解码器相比,使用 H.264 可以在更小的空间内获得相似的结果,或者在相同的空间内获得更好的结果。此外,使用 x264 进行编码的工作流程和选项与 XviD 类似,但输出大大改进。因此,如果您习惯于使用 XviD 进行编码,那么在使用 x264 时,许多概念和选项对您来说应该是熟悉的。
您对 x264 进行的实验越多,您就会发现比特率和文件大小的惊人节省,同时仍保持极高的视觉质量。视频编码世界绝对是一门黑魔法,因为在任何特定的编码项目中都可以使用数百个变量和选项。没有一种适用于所有视频编码的方法。然而,H.264 相对于 XviD 或常规 MPEG-2 编码视频的技术优势太大了,不容忽视。而且,您可以立即开始利用它,使用上面描述的工具。由于 H.264 是 MPEG 标准编码,与 MPEG 标准音频编解码器一起在 MPEG 标准容器格式内使用,因此您在使用这些工具对视频进行编码方面投入的所有工作都将具有面向未来的高品质。使用上面概述的技术作为您自己的 H.264 编码项目的起点,您将发现为什么 H.264 正成为视频编码的下一个标准。
本文资源: /article/9197。
Dave Berton 是一名专业程序员。可以通过 mosey@freeshell.org 与他联系。