使用 Linux 流媒体传输 MPEG-4

作者:Donald Szeto

编者注:本文自最初发布以来已更新。

七年前,当我还是个懵懂的孩子时,我使用 56k 连接在互联网上播放了我的第一个视频剪辑。它是 Real Media 格式,包含 11Kbps 的视频轨道和单声道音频轨道。所有的缓冲都让我抓狂。如今,有了各种高速线路,您在播放流媒体视频剪辑时很少遇到网络拥塞。这种新的速度促进了互联网上多媒体的快速发展。其中之一就是视频流媒体。

什么是视频流媒体?传统上,我们必须下载整个视频文件才能播放它。使用流媒体,发送到流媒体客户端的视频数据会立即解码和播放,因为它会被接收。视频会议、监控系统和视频点播 (VOD) 等实现都基于视频流媒体技术。

当人们谈论视频流媒体时,首先想到的词是“昂贵”。即使您只是转换现有的媒体内容,转换所需的软件对于普通的家庭用户来说也可能是负担不起的。使用 Linux 进行视频流媒体的主要原因之一是它价格低廉。大多数 Linux 视频编码和流媒体工具都是免费的,并且易于设置。在不到一个小时的时间内,就可以拥有一个流媒体服务器,提供十几个 MPEG-4 剪辑。MPEG-4 允许以不同的比特率和分辨率进行编码,而这些在其他一些编解码器中是受限制的。当然,使用 MPEG-4 的最大优势在于它提供了一种正在变得越来越流行的标准格式。与专有格式不同,MPEG-4 是一种开放标准,因此添加 MPEG-4 支持很容易。市场上已经出现了一些 MPEG-4 音频和视频播放器,未来还将发布更多。

关于设置

如果您要流媒体传输 MPEG-4 剪辑,则设置很简单。您只需要一个具有快速连接的 MPEG-4 流媒体服务器。如果您只为几个朋友提供服务,DSL 线路就足够了。但是,如果您想实施视频会议或监控系统,则需要在 Linux 下使用实时 MPEG-4 编码器和兼容的视频捕获设备。当然,市场上也有将视频实时编码为 MPEG-4 的板卡,但对于家庭用户来说通常非常昂贵。在 Linux 下,MPEG4IP 套件、FFmpeg 多媒体系统和 Apple 的 Darwin Streaming Server 提供了一种廉价的方式来流媒体传输和创建 MPEG-4 内容。

编译和安装 MPEG4IP

MPEG4IP 项目始于 2000 年夏天,由 David Mackie 发起,他在 Cisco Systems 从事多媒体流媒体工作。他不再积极参与该项目,Bill May 现在是主要开发人员。该项目在 Mozilla Public License 1.1 下获得许可,但 MPEG4IP 中使用的编解码器可能需要支付专利许可费,具体取决于它们的使用方式。在使用它们之前,您应该阅读软件包中的 COPYING 文件。许可费也与 MPEG-4 相关联,包括每流收费。计划进行商业活动的人应该首先检查一下。

在 MPEG4IP 软件包中,有一些方便的工具可以帮助您编码和播放 MPEG-4 剪辑。您可以从 mpeg4ip.sourceforge.net/ 或其在 SourceForge 上的 CVS 获取副本。在我撰写本文时,0.9.7 是最新的稳定版本。如果您想尝试新功能,请从 CVS 存储库获取 0.9.7.7 版本。如果您要编译 mp4live(默认启用),即用于直播的实时 MPEG-4 编码器,您还需要 LAME 软件包。解压软件包并开始编译

tar zxvf mpeg4ip-0.9.7.tar.gz
./bootstrap
make
make install

要在不使用 mp4live(和 LAME)的情况下进行编译,请在 ./bootstrap 之后添加 --disable-mp4live。MPEG4IP 使用了 SDL 库的修改版本,因此您无需费心安装它。但是,如果您想编译 GUI 播放器,则需要 GTK+ 库。

编译和安装 FFmpeg

FFmpeg 多媒体系统本身是创建和流媒体传输 MPEG-4 的完整解决方案。在撰写本文时,稳定版本为 0.4.6。流媒体服务器在此阶段仅支持 HTTP 流媒体,因此我们目前利用 FFmpeg(编码器)。从 SourceForge 获取源代码并开始编译

tar zxvf ffmpeg-0.4.6.tar.gz
./configure
make
make install

此配置足以进行 MPEG-4 视频编码。如果您需要 MP3 和 OggVorbis 编码支持,请添加 --enable-mp3lame--enable-vorbis 并预先安装它们各自的库。

从源文件中提取内容

在我的学校,视频剪辑以不同的格式存储。在大多数情况下,情况很可能也是如此——您不需要只将一种格式转换为 MPEG-4,而是需要转换多种格式。我的一些视频团队成员将剪辑存储为 MPEG-1 和 2,一些人存储为 DivX 或 XviD AVI,如果他们没有时间编码,则有些人使用 DV AVI。在这里,我们讨论如何将这些格式编码为 MPEG-4,因为它们很可能是我们可能遇到的最常见的格式。

没有一个具有单个按钮的工具可以为您很好地完成所有编码工作。您需要分别编码视频和音频,因此要做的第一件事是分离视频和音频。在 Linux 下,FFmpeg 是视频处理的瑞士军刀。它可以编码和解码各种视频格式,并支持一些基本的视频处理,例如去隔行。要从源文件中提取音频轨道,请输入

ffmpeg -i <input_file> -vn <output_file>

该命令可以应用于 DV/DivX/XviD AVI 和 MPEG 文件。vn 开关禁用输出文件中的视频。生成的文件将是原始 PCM 音频文件。

编码音频

要生成 MPEG-4 兼容的剪辑,您需要 MPEG-4 AAC 音频。MPEG4IP 套件包含一个重新分发的 AAC 编码器,称为 FAAC。在撰写本文时,FAAD2 在 SourceForge 上可用,并使用 1.1 版本的库进行编码,速度更快一些。如果您有兴趣,可以从 faac.sourceforge.net 获取源代码。当您安装 MPEG4IP 套件时,应该已经正确安装了 FAAC 二进制文件的副本。

要编码由 FFmpeg 分离的原始 PCM 音频轨道,请输入

faac -m4 -b64 -r48000 -pLC <input_file> <output_file>

-m 标志指定 AAC MPEG 版本。我们正在创建 MPEG-4 AAC,因此我们使用 -m4。-b 标志指定编码输出的比特率。32 或 64 的值可以产生令人满意的质量,并且对于流媒体传输来说是经济的尺寸。-r 标志指定输入文件的采样率;否则,FAAC 将无法读取该文件。相反,它会产生一个错误,通知用户不支持该文件格式。最后一个 -p 标志指定配置文件,这有点复杂。“Main”配置文件包含所有编码工具(MPEG 术语理解为“功能”)。LC 配置文件代表低复杂度,降低了客户端的解码复杂度(适用于慢速设备或机器)。LTP 配置文件代表长期预测,在质量方面提供了显着改进,但也增加了解码复杂度。它最适合具有清晰音调的音轨。在我的学校的 MPEG-4 剪辑中,我大部分时间都使用 LC。

编码视频

MPEG4IP 套件带有两个编码器:mp4encode 和 xvidenc。mp4encode 使用其内置的 OpenDivX 编码器或 ISO MPEG-4 编码器(如果指定)将 AVI 文件编码为 MPEG-4 视频剪辑。另一方面,xvidenc 使用 XviD 编码器编码原始视频文件。如果您使用这些实用程序进行编码,则输入 AVI 文件必须包含原始 YV12 (YUV12) 格式的视频轨道,并且音频轨道必须为原始 PCM 格式。在本文中,相反,我将展示如何使用 FFmpeg 来简化视频编码过程。由于 FFmpeg 解码 DV、MPEG-1 和 2、DivX 和 XviD,我们可以跳过为 mp4encode 或 xvidenc 准备 YV12 原始文件的步骤。从这些格式编码为 ISO MPEG-4 视频的命令是相同的

ffmpeg -i <input_file> -an -b 300 -vcodec mpeg4 <output_file>

然后,FFmpeg 使用 ISO MPEG-4 编码器将输入文件(不带音频,-an 标志)以 300 千比特/秒的速度编码为包含单个 MPEG-4 视频轨道的 AVI 视频文件。如果您想在 Linux 下对 NTSC 源执行反向电视电影 (IVTC),则需要 transcode,这是另一个提供有用视频处理功能的优秀程序套件。也可以在 2-pass 模式下编码视频以获得最佳效果。

第一次编码

ffmpeg -i <input_file> -an -pass 1 -passlogfile <log_file>
-qscale 2 -vcodec mpeg4 <output_file>

第二次编码

ffmpeg -i <input_file> -an -pass 2 -passlogfile <log_file>
-b 300 -vcodec mpeg4 <output_file>

输入文件、输出文件和两个编码过程中的日志文件必须相同。此外,您应该在第二次编码过程中指定您期望的比特率,而不是第一次编码。

多路复用:组合视频和音频

编码音频和视频后,就该将它们组合起来以创建真正的 MPEG-4 剪辑了。MPEG4IP 套件为此目的提供了一个不错的工具,称为 mp4creator。它可以添加或删除 MPEG-4 文件中的轨道。但是,让我们首先通过添加视频轨道来创建 MPEG-4 剪辑

mp4creator -c myvideo.avi -hint mytest.mp4

-hint 标志告诉 mp4creator 为视频轨道添加额外的提示轨道。如果您正在使用 Darwin Streaming Server 流媒体传输剪辑,则需要提示。如果 mytest.mp4 文件尚不存在,mp4creator 会为您创建它。要添加音频轨道,请输入

mp4creator -c myaudio.aac -hint -interleave mytest.mp4

这两个命令执行类似的操作。第二个命令引入了 -interleave 标志,该标志为音频提示轨道创建交错的 RTP 有效负载格式。如果您将 MP3 用于音频轨道(可能不是),请忽略此标志,因为它仅支持 AAC。最后,优化剪辑

mp4creator -optimize mytest.mp4

此命令优化文件布局,从而提高其在流媒体传输期间的速度。重新排列的 MPEG-4 文件在文件开头包含控制信息,从而启用文件的 HTTP 流媒体传输。要查看 MPEG-4 文件中的轨道列表,请使用

mp4creator -list mytest.mp4

如果您有一个成功的 MPEG-4 剪辑,则列表应如下所示(当前在我的学校流媒体传输的剪辑)

轨道

类型

信息

1

视频

MPEG-4 Simple @ L3, 30.030 秒, 299 kbps, 352x240 @ 29.97 fps

2

提示

轨道 1 的有效负载 MP4V-ES

5

音频

MPEG-4, 29.973 秒, 65 kbps, 48000 Hz

6

提示

轨道 5 的有效负载 mpeg4-generic

7

od

对象描述符

8

场景

BIFS

在将剪辑上传到流媒体服务器之前,您应该对其进行测试。MPEG4IP 套件带有 mp4player 和 gmp4player,用于播放本地存储或流媒体传输的 MPEG-4 文件。您应该使用 gmp4player,因为控制台播放器几乎无法控制视频播放。如果一切看起来都不错,请将 MPEG-4 文件上传到流媒体服务器的媒体目录。万岁!您的视频已准备好在网络上流媒体传输!

设置 Darwin Streaming Server

从第四版开始,Darwin Streaming Server 不仅流媒体传输 QuickTime 影片,还流媒体传输 MPEG-4 影片。好处是 Darwin Streaming Server 完全免费用于非商业用途,并且在 Linux 下运行顺畅,负载很小。

要获取流媒体服务器的副本,请访问 Darwin 项目页面。您需要具有有效的 APSL(Apple Public Source License)注册才能下载二进制文件或源代码。按照网站上的说明了解如何获取 APSL 注册的详细信息。获取适用于 Linux 的服务器二进制文件(网站显示 Red Hat Linux 7.x)以及代理(如果您需要为防火墙后面的客户端提供服务)。将软件包解压缩到本地目录并开始安装

tar zxvf DarwinStreamingSrvr4.1.2-Linux.tar.gz
cd DarwinStreamingSrvr4.1.2-Linux
./Install

确保您已安装 Perl 以用于基于 Web 的管理界面。如果您需要 SSL 支持,请同时安装带有有效证书的 Net::SSLeay 和 OpenSSL。安装脚本会自动将文件复制到合适的位置,并显示它们复制到的位置。然后,它会要求您提供管理用户名和密码,稍后将使用该用户名和密码登录基于 Web 的管理界面,您可以在其中访问服务器的大部分功能。

接下来,使用 Perl 脚本 streamingadminserver.pl 启动管理界面。如果 Darwin Streaming Server 尚未运行,它将启动 Darwin Streaming Server。将您喜欢的浏览器指向视频服务器的端口 1220,如果启用了 SSL 支持,则指向端口 1240。使用您在安装期间设置的帐户登录。由于这是您第一次登录,因此会显示设置助手。它会引导您完成基本设置,并为每个项目提供详细说明。您需要有效的 SSL 证书才能启用 SSL 支持,除非您修改脚本。完成设置助手后,您将拥有一个正在运行的 Darwin Streaming Server,可以向线路发送大量 MPEG-4 视频。

流媒体传输剪辑

现在您手头有一个 MPEG-4 剪辑,并且已准备好进行流媒体传输。一种选择是通过 HTTP 流媒体传输;只需将剪辑放在 Web 服务器上可公开访问的目录中,并将您的播放器指向剪辑的 URL 即可。如果您想通过 RTSP 流媒体传输,请将您的播放器指向 rtsp://<server_name>/<clip_name>。(例如,rtsp://video.wyk.edu.hk/sample_100kbit.mp4 是 Darwin Streaming Server 提供的示例剪辑。)通过 RTSP 流媒体传输允许随机查找,而无需等待剪辑逐步下载。

如果您想创建播放列表或进行直播,则需要创建 SDP(会话描述协议)文件。要创建一个,请登录到您的视频服务器的管理界面,然后转到“播放列表”部分。创建一个新的电影播放列表,并将随附的媒体拖到播放列表中。为播放列表命名并指定挂载点,即 SDP 文件。保存列表,并且不要忘记之后启动列表。不要将您的播放器指向 MPEG-4 文件,而是提供新的 URL,rtsp://<server_name>/<sdp_name> 以接收广播。恭喜您!您已成功创建了一个流媒体 MPEG-4 系统和您的第一个 MPEG-4 视频剪辑。

如果您想从捕获设备流媒体传输实时视频,请使用 MPEG4IP 附带的 mp4live。您需要在内核中使用 Video4Linux 兼容的捕获设备、Video4Linux 和 I2C 支持才能进行直播。mp4live 的用户界面非常不言自明。您可以将视频录制到 MPEG-4 文件中,也可以使用单播或组播将其流媒体传输到客户端。单击“Generate”按钮以生成 SDP 文件,并将其复制到视频服务器的媒体目录。

如果您在本地 LAN 或企业网络中,组播将是最佳方法。在这种方法中(在 QuickTime、Real 和 gmp4player 上),您将 SDP 文件直接传递给程序。在广播机器上设置 Web 服务器,然后将播放器指向 http://<server machine>/capture.sdp,其中 capture.sdp 是上述生成的 SDP 文件。使用单播,您将使用 rtsp://<server machine>/capture.sdp 代替。服务器机器必须运行 Darwin Streaming Server,结果是流是单播和重复的。这应该仅在组播不可用时使用。

关于兼容性的一些说明

尝试编码视频的人可能会抱怨视频质量。Windows 和 Linux 中使用的 MPEG-4 编解码器是相同的,那么区别是什么?决定视频最终质量的关键组件是速率控制器。事实是 Linux 中的速率控制器仍然需要一些工作。如果您可以,我建议使用著名的 VirtualDub(免费并在 GPL 下获得许可),因为它在视频编码和处理方面更强大,并且可以显着提高视频质量。

大多数人更喜欢使用 QuickTime、RealPlayer 或 Windows Media Player 播放流媒体视频。从版本 6 开始,QuickTime 内置了对 MPEG-4 的支持,因此您需要做的就是升级您的 QuickTime Player。对于 RealPlayer 和 Windows Media Player,您必须安装 EnvivioTV 插件,该插件可以免费下载和使用。您可以从 www.envivio.com 获取副本。

网上可以找到许多关于 QuickTime 6 的 MPEG-4 支持的讨论。简而言之,许多用户无法使用 QuickTime 6 播放流媒体 MPEG-4,有时他们会收到奇怪的错误消息。问题在于 QuickTime 6 中 MPEG-4 的实现。众所周知,使用 GMC(全局运动补偿)、四分之一像素 (qpel) 和色度运动编码的 MPEG-4 视频无法使用 QuickTime 6 播放。QuickTime 6 还使用 MPEG 量化器,它可以提高清晰度,并且在保持质量方面优于 H.263。我在学校进行的广泛测试表明,比特率低于 64 千比特/秒的 MPEG-4 AAC 音频会在 QuickTime 6 中产生奇怪的错误消息。但是,MPEG4IP 提供的播放器没有 QuickTime 6 的相同问题。

QuickTime 6

  • 友好的用户界面。

  • 流行。

  • 与浏览器集成。

  • 仅播放某些 MPEG-4 文件。

MPEG4IP mp4player

  • Windows 版本的播放器缺少良好的用户界面。

  • 公众不太了解。

  • 需要手动输入 URL。

  • 播放大多数 MPEG-4 文件。

结论

在编码 MPEG-4 流媒体视频剪辑之前,您必须考虑一些事项。您是想保持最高质量还是兼容性?剪辑的目标受众是谁?如果您要向一大群人或公众展示剪辑,最好编码剪辑,使其可以由常见的视频播放器播放。如果您想保持质量,您可以在编码期间使用 MPEG 量化器或上面讨论的 MPEG-4 编码工具。您应该提供 MPEG4IP 播放器的下载,以便用户能够正确播放它们。MPEG4IP 套件包括 Visual Studio 工作区文件,可让您编译 Windows 版本的播放器 wmp4player。也请提供它,因为您的大多数客户可能都在运行 Windows。

MPEG-4 将成为未来几年视频流媒体的趋势。我们今天拥有的 MPEG-4 实现仍然不是完整的 MPEG-4 工具箱。例如,自然和合成内容的集成以及广播级同步需要进一步发展。随着技术的日益成熟,MPEG-4 将很快成为互联网视频的标准。

致谢

我要感谢 MPEG4IP 项目的主要开发人员 Bill May 对本文的评论和建议。

电子邮件:dszeto@wyk.edu.hk

加载 Disqus 评论