高级 MythTV 视频处理

作者:Matthew Gast

由于 Linux 的稳定性和可扩展性,它经常出现在计算的前沿。Linux 已经成为家庭影院音视频应用的一个有希望的平台。我现在使用一台运行 MythTV 的专用 Linux PC 来处理电视观看。在设置 MythTV 时,我遇到的两个主要痛点都与视频处理有关。第一个挑战是配置流畅的视频播放,第二个挑战是将录制的节目随身携带。

视频播放反交错

为了在当时的电子设备的限制内工作,电视帧被分成两个独立的“场”进行传输。一个场由图像中偶数或奇数的水平线组成。在播放时,偶数场和奇数场被交织在一起,距离显示器足够远的观看者会看到连续的混合运动。

两个连续的场是相关的,但并不完全相同。在摄像机快速左右运动期间,一个场会稍微领先于它的前一个场,并且在屏幕上滑动的图像可能会出现锯齿状边缘。图 1 是一个 1080i 高清广播的屏幕截图。在场景中,摄像机从左向右摇摄,导致图像中的物体在屏幕上快速滑动。每个场的位置都略有不同,导致锯齿状边缘失真,也称为梳状、锯齿或鼠牙。在侧向运动量很大的场景中,可能很难通过失真来跟踪内容。

Advanced MythTV Video Processing

图 1. 播放时的梳状失真

为了使像图 1 这样的视频可以观看,可以通过一个称为反交错的过程将其转换为平滑的图像。MythTV 为用户提供了几种反交错方法的选择

  • 单场—这种极其简单的方法不是使用两个场来表示一个帧,而是只保留两个场中的一个。每隔一个场显示为静止图像,未使用的场被丢弃。

  • 线性—此方法将直接相邻的线(根据定义,这些线来自备用场)混合在一起。可能会出现轻微的重影图像,但锯齿状失真将消失。

  • 内核—此方法将多条线而不是仅相邻线混合在一起。重影图像不会出现,但可能会残留一个场的微弱残余。

  • Bob—Bob 是最消耗资源的方法。每个场都被行加倍以创建一个帧,然后以双倍帧速率播放重建的帧。

反交错确实需要大量的处理能力,但大多数现代 CPU 都有多媒体指令集,可以减少处理能力的负载。如果您有带有 MMX 或 SSE 指令的 Intel 处理器,或者带有 3Dnow! 的 AMD 处理器,则反交错应该不会太困难。

Bob 是与同步电视输出一起使用的最佳反交错方法,尽管它可能会给性能较差的机器带来负担。我的个人 MythTV 前端是一台 2GHz AMD Athlon64,它有足够的功率将 Bob 反交错的高清视频显示到模拟电视上。虽然 CPU 要求高于其他反交错方法,但仍在我的系统的性能能力范围内。

线性反交错和内核反交错具有相似的视觉效果,后者对 CPU 的影响略大。两者都比 Bob 的资源消耗少,这可能对性能不足的 CPU 有帮助。在这两者之间,我更喜欢内核反交错,因为它混合了多条相邻线并消除了重影,这使得生成的图像更清晰。

将视频导出到其他系统

设置 MythTV 系统的最初原因之一是希望将我的电视节目随身携带。现在“电视”意味着“硬盘上的文件”,因此存储、传输和在方便我的地方观看要容易得多。像许多移动专业人士一样,我的笔记本电脑实际上已成为一个额外的附属物,它是移动播放视频的理想平台,尤其是在许多飞机都为移动电子设备增加了电源端口之后。

从 MythTV 导出视频的基本矛盾是在大小和处理时间之间进行权衡。数字电视广播标准描述了如何通过电视频道发送 MPEG-2 视频流,因此 MythTV 自然地以其“自然” MPEG-2 格式存储数字电视广播。将 MPEG-2 数字电视流转换为另一种基于 MPEG-2 的视频格式相对容易,并且可以在不花费大量处理时间的情况下完成。将数字电视流转换为 MPEG-4 需要更多的处理能力,但生成的视频文件会小得多。

提取 MythTV 录制

虽然数字电视录制是 MPEG-2 视频流,但 MythTV 使用的 NuppelVideo 容器格式是 MythTV 特有的,并且大多数视频播放器软件都不支持。要使用 MythTV 前端以外的任何工具观看视频,您必须将它们转换为具有更广泛播放器选择的格式。

导出视频因 MythTV 用于存储录制的文件名而变得更加复杂。文件名的第一部分是 MythTV 使用的频道号,两个长数字是开始日期和结束日期

myth:/video$ ls -lh *.nuv
-rw-r--r--  1 mythtv users 2.8G Sep  3 08:00 1000_20050903073000_20050903080000.nuv
-rw-r--r--  1 mythtv users 9.1G Aug 31 23:30 1007_20050831220000_20050831233000.nuv
-rw-r--r--  1 mythtv users 808M Sep  3 01:30 1008_20050903010000_20050903013000.nuv
-rw-r--r--  1 mythtv users 1.8G Sep  1 09:00 1009_20050901080000_20050901090000.nuv
-rw-r--r--  1 mythtv users 3.7G Aug 28 22:00 1019_20050828210000_20050828220000.nuv

将 MythTV 录制转换为更广泛支持的格式的工具很容易获得。mythtranscode 是一个程序,可以将 MythTV NuppelVideo 文件解码为许多程序支持的标准视频流,它是 MythTV 发行版的一部分。通过将 mythtranscode 的输出馈送到您选择的编码器程序,您可以创建任何类型的视频文件。一个常见的编码器程序选择是 FFmpeg,它支持许多常见的视频格式。理论上,将这两个程序链接在一起以生成可理解的输出文件是可能的,但是浏览所有命令行选项和系统上的录制是一个复杂的过程。

输入 nuvexport,这是一个 Perl 脚本,可以以极其友好的方式为您管理该过程。nuvexport 组装运行 mythtranscode 和 FFmpeg 所需的命令行选项。它使用基于文本的菜单界面来指导您完成选择要导出的节目,然后设置转换程序的任何必需参数的过程。

在安装 nuvexport 之前,有一些必要的支持工具。FFmpeg 是重新编码为选定目标格式所需的默认程序。(nuvexport 也支持 transcode,但速度慢得多。)MPlayer 用于解码 MythTV 文件以进行转换。许多转换会导致出现需要过滤掉的噪点。nuvexport 使用 yuvdenoise 程序,它是 MJPEG 工具之一。所有这三个程序都得到了广泛使用,并且很可能作为您 Linux 发行版的软件包提供。nuvexport 也使用 DateManip 模块,因此请从您发行版的软件包站点或您最喜欢的 CPAN 镜像站点获取该模块。

nuvexport 的第一个提示是选择导出视频文件的格式。基本的权衡是选择基于 MPEG-4 的导出格式以获得最小的文件大小,但以额外的处理时间为代价来准备它,还是使用更大但更易于准备的格式之一。主要选择是

  • 视频 CD (VCD) 由 1,150kbps 的 MPEG-1 视频流组成,音频在单独的 MPEG layer 2 (MP2) 音轨中,速率为 224kbps。

  • 超级视频 CD (SVCD) 由可变速率的 MPEG-2 视频组成,同时保留 MP2 音轨。与 VCD 不同,音轨可以有多个声道,因此 5.1 或 7.1 音频可以存储在这种格式中。

  • DVD 基于 MPEG-2 视频,具有多种音频轨道选项。它的分辨率高于任何一种视频 CD 格式。

  • DivX 是一种基于 MPEG-4 的格式,可生成小文件。但是,它在文件大小最小化的同时,质量损失并不明显。DivX 可以生成恒定速率视频或可变速率视频。

  • XviD 是一种基于 MPEG-4 的格式,它是 DivX 开发的一个分支。它基于 2001 年发布的 DivX 编解码器的开源开发。默认情况下,nuvexport 对 XviD 使用可变速率视频编码,并提供单遍或多遍的选项。多遍可以提高视频质量,但会增加处理时间。

  • 高级流格式 (ASF) 由 Microsoft 开发,作为媒体的通用容器,它通常与 Windows Media Audio (WMA) 和 Windows Media Video (WMV) 文件一起使用。WMV 基于 Microsoft 对 MPEG-4 的扩展。

根据我的经验,VCD 和 SVCD 编解码器以快速的处理时间提供良好的质量,而 DivX 和 XviD 编解码器提供最小的文件大小,但需要更长的时间才能生成。在选择视频导出格式后,nuvexport 使用基于文本的菜单系统来选择要导出的剧集并设置编解码器的参数。

在选择一组要导出的剧集后,nuvexport 会提出标准问题,例如将导出的文件放在哪里。它提供了使用 MythTV 剪切列表的选项,该列表从导出的视频中剪切掉广告。降噪和反交错作为选项提供。虽然两者都默认为“是”,但我通常会禁用它们,因为这会增加处理时间。许多视频播放器可以在播放时进行反交错,而且我没有发现转换产生的过多噪点。

某些导出格式有其他编解码器特定的问题。DivX 和 XviD 都允许调整比特率和分辨率。音频 128kbps 和视频 960kbps 的默认比特率足以在大多数计算机显示器上生成高质量的视频。在设置视频大小时,nuvexport 首先提示输入宽度,然后根据录制的宽高比建议高度。保持宽度小于录制宽度。624 的默认宽度通常会产生良好的视频,但对于 1920x1080 的录制,它可以更大。VCD 和 SVCD 不会提示输入分辨率,因为这些格式具有固定的分辨率。

表 1 比较了每种不同格式、MythTV 本机格式和我的商用 DVR 所需的处理时间和空间。作为源,我使用了一集 PBS 的 Nova 节目,该节目以 704x480 的分辨率传输。“商用 DVR”条目是指从我的商用 DVR 传输到我的笔记本电脑的视频节目。根据经验,MPEG-2 每小时大约需要 1GB,但 MPEG-4 仅需 350–450MB。表中列出的编码时间没有考虑反交错或降噪;我在播放时在视频播放器中执行这两项任务。

表 1. 导出结果(典型)

格式分辨率文件大小编码时间
Myth 本机格式704x4801,756MB不适用
商用 DVR不适用1,236MB不适用
VCD352x240596MB15 分钟
SVCD480x480601MB25 分钟
DVD720x480899MB34 分钟
DivX624x464432MB35 分钟
XviD(1 遍)624x464451MB1 小时 39 分钟
XviD(2 遍)624x464472MB2 小时 35 分钟
ASF320x240143MB18 分钟

虽然 ASF 的尺寸最小,但它也是迄今为止外观最差的。ASF 文件中有大量的压缩伪影,这使得观看时非常分散注意力。虽然小尺寸很有吸引力,但糟糕的图像质量使其被排除在外。DVD 视频具有最佳的图像质量,但也需要最多的磁盘空间。作为两者之间的折衷方案,我使用 VCD 和 DivX,具体取决于优先级。我使用前者快速创建文件,而后者创建尽可能小的文件。

视频转码是一个 CPU 密集型过程。默认情况下,nuvexport 以较高的 nice 值运行其辅助进程,以防止它们干扰其他系统操作,例如视频播放或录制。所有最新的 Linux 发行版都具有允许 CPU 时钟速度根据处理能力需求而变化的软件。我使用 CPU 速度控制将时钟速度保持在尽可能低的水平,同时仍然完成我想做的工作。许多 CPU 速度控制程序不会考虑 niced 进程,但可以将它们配置为这样做。我的 Linux 发行版使用 CPUfreq 内核驱动程序,该驱动程序需要配置为监视 niced 进程。一个小的启动脚本运行以下两个命令

echo "ondemand" > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
echo "1" > /sys/devices/system/cpu/cpu0/cpufreq/ondemand/ignore_nice

第二个命令指示 CPUfreq 驱动程序计算来自 niced 进程的处理需求。表 1 中列出的时间来自以最高速度运行的 2.0GHz AMD Athlon64。在 1.0GHz 的最低速度下,处理时间大约是三到四倍。从 MythTV 导出视频只是战斗的前半部分。一旦生成视频,就可以将其传输到另一个位置进行播放。除了观看平台上的播放应用程序外,还有两个值得注意的开源播放应用程序:MPlayer 和 Video LAN Client (VLC)。我使用 MPlayer 是因为内置的反交错功能比 VLC 产生更平滑的图像。这两个应用程序都可以在 Linux 和 Windows 上使用。

MPlayer 的命令行在不同的主机操作系统上是相同的。目标是获得清晰的全屏视频播放。-fs 选项以全屏播放视频,因此视频周围没有窗口。视频过滤器可用于更改播放,并使用 -vf 选项激活。我使用两个 -vf 选项。一个使用 expand 过滤器在屏幕周围创建一个小的黑色边框。expand 过滤器接受多个参数。负数被解释为边框。过滤器-vf expand=0:-50在屏幕底部放置一个 50 像素的边框,并将视频居中放置在边框中。为了获得清晰的视频,反交错是必要的。MPlayer 使用后处理过滤器(缩写为 pp)激活反交错。作为一般规则,我打开四个后处理过滤器:水平去块 (hb)、垂直去块 (vb)、去振铃 (dr) 和亮度/对比度校正 (al)。生成的过滤器使用以下命令激活-vf pp=hb/vb/dr/al。将它们放在一起,命令行是

mplayer -fs -vf pp=hb/vb/dr/al -vf expand=0:-50 (filename)

在播放期间,MPlayer 广泛的键盘命令可以实现暂停、快进和图像调整以及屏幕显示。

本文资源: /article/8585

Matthew Gast 是无线 LAN 领域领先技术书籍《802.11 无线网络:权威指南》(O'Reilly Media 出版社)的作者。他目前花费了太多时间使用 MythTV。可以通过 matthew.gast@gmail.com 与他联系,但仅限于他在海平面附近时。

加载 Disqus 评论