2009年8月3日星期一

Linux的应用--Video Streaming探讨一

作者: 陈俊宏 www.jollen.org
Video Streaming 的技术已经出现多年,在 Internet 上的应用也已经相当广泛,而利用 Linux 建构 VideoStreaming Server 也是相当热门的话题。如果您想了解什么是 Video Streaming,本文对 VideoStreaming 的观念与技术将做了清楚而基本的介绍。
Video Streaming 来的正是时候
看到 "Video" Streaming 就知道这个技术与影音有关。Video Streaming 是一种经由网络来拨放影音档案的技术,Video "Streaming" 的基本概念为「一边下载一边拨放」,我们称之为「Play as received」。
经由 Internet 如果要收看远端服务器的电视档案,最原始的做为是「下载后再拨放」,也就是经由 FTP 或 HTTP 将整个档案下载至本地端后再利用拨放程序来拨放,我们称之为「Play after download」。
以最常见的例子来讲,我们可以经由网络将 MP3 完整下载后再拨放,也就是 Play after download,或者我们也可以一边下载MP3 一边听音乐,这种方式则称为 Play as received。其他的应用范例还很多,例如利用RealPlayer「即时观看影片或是听音乐」,这种即时拨放的方式即是 Play as received,我们称这样的技术为 VideoStreaming Technology。
为什么说 Video Streaming 的技术来的正是时候呢?举个最简单的情况,你可能在下载 MP3之前想要试听一下音乐的内容,而下载音乐片段的方式又显得不够友善,这时如果利用 Video Streaming的技术来让网友视听,不但方便,而且不必浪费时间来下载不喜欢的音乐的。
随着网络频宽的改进与 IPv6 的出现,Video Streaming 的应用将越来越广泛,利用 Video Streaming 来设计的信息家电也会越来越多,例如较常被提及的网络电话 (InterPhone)。
除了宽带网络的普及外,储存设备的大进步也是加速 Video Streaming 进用普及的最大动力,例如利用 Linux 设计的 NAS 可以被用来当做大型的影音服务器或是动态电影资料库 (DMD)。
VCD & MPEG-1
要提到拨放动态影音的先躯,绝对要先从 VCD 说起,因为这是在计算机出现后,最能深入消费者市场的产品。
想当年,要拨放 VCD 除了要有一台当时算是高挡货的 1x CD-ROM 外,还要再另外加装也是高挡货的 MPEG 卡。拨放 VCD 其实就是Video Streaming 的技术,因为 VCD 的资料是一边读取一边拨放,那为什么要有 MPEG Card呢?理所当然的,这是因为MPEG-1 的标准。
MPEG-1 被设计在 1x CD-ROM 上拨放 VCD,而 VCD 上的资料必须经由 MPEG Card 解码 (decode)后才能拨放。但是随着硬件的进步,现在可以经由软件来做 MPEG-1 解码的工作。我们将在后文介绍 MPEG-1 的设计概念。
DVD & MPEG-2
MPEG-2 常被提到则是由于 DVD 的流行。不管是 MPEG-1 或是 MPEG-2,其实是一种编码的技术,而 DVD-ROM 则是选择了 MPEG-2 来当做它的压缩标准。
而 DVD 之所以无法像 VCD 一样能被「备份到硬盘」,则是由于其中又加进了三道的保护,第二道保护就是玩家们耳熟能详的 CSS。在 Linux 下之所以无法有「合法」的 DVD Player,就是受制于 CSS 的关系。
利用 NAS 来设计 Video Server,要储存并广拨 VCD 已经没有技术上的障碍,但是要储存并扩拨DVD,则有法律上的问题,这点是值得我们深思的一个问题。因为目前 CSS 的技术掌握在日本人手里,要取得这项技术必须签署 NDA,不过 CSS并非不可破解想必大家都知道,但是就是有版权上的问题。
影像编码技术介绍
目前学术界已经发展出许多处理影像讯号压缩及编码的技术 (codecs),谈到这些技术,应用最广泛的编码标准底下四种:
1. ) H.261
2. ) H.263
3. ) JPEG, MJPEG
4. ) MPEG
底下将分别简单介绍这四种编码技术。
H.261 标准
H.261 的影像编码标准出现在 1990 年的 ITU。一开始的用途主要是支援影像电话 (video phone) 与视讯会议 (video conferencing)。H.261 的格式有二种,分别有不同的解析度:
1. ) QCIF:176x144
2. ) CIF:352x288
H.261 的 fps (frames per second) 可以达到 7.5, 10, 15 与 30 fps。由于 H.261一开始是架构在 ISDN B 上面,而 ISDN B 的传输速度为 64 Kbps,所以 H.261 也被称为 Px64 (x = 1 to30)。
CIF 全名为 (Common Intermediate Format),主要是为了要支援各种不同解析度的电影而被定义出来,例如 NTSC, PAL, SECAM 电视系统。而 QCIF 则是 Quarter-CIF 也就是 CIF 解析度的一半。
除此之外,H.261 也可以说是 MPEG-1 标准的前辈。
H.263 标准
H.263 是 H.261 的加强版,诞生于 1994 年 (ITU)。H.263 开始支援 PSTN,不过要特别说明一点,H.263 比 MPEG-1 还要晚出现,而且 H.263 还是基于 MPEG-1 而发展。
H.263 的标准共支援五种不同的解析度,分别为:
1. ) Sub-QCIF:128x96
2. ) QCIF:176x144
3. ) CIF:352x288
4. ) 4CIF:704x576
5. ) 16CIF:1408x1152
传输速度为 8 Kbps ~ 1.5 Mbps。除此之外,H.263 也是 MPEG-4 标准的基础。
JPEG
提到 JPEG 的标准,大家可就不莫生了,由其是在 GIF 发出禁令后,JPEG 更是被广泛应用。JPEG 的全名大家一定不莫生,他可是赫赫有名的一群技术团队的缩写 - Joint Photographic Experts Group。
JPEG 是 24-bit 的 "true-color" 影像标准,JPEG 的工作是将 RGB 格式的影像转换成 YCrCB 格式,目的是为了减少档案大小,一般约可减少 1/3 ~ 1/2 左右。
不过 MJPEG 才是我们的主角,MJPEG 全名为 "Motion" JPEG,也就是会动的 JPEG 图档。许多 VideoStreaming 的场合,像是简单的视讯会议软件都会使用 MJPEG 来取代 MPEG,原因无它,因为 MJPEG格式简单,但缺点是不支援声音。
MPEG-1 标准
MPEG 的标准由 ISO (International Standards Organization) 所制定,全名为 MovingPictures Experts Group (MPEG 为 ISO 工作),这些团队制定了包括 MPEG-1、MPEG-2、MPEG-4等标准。
MPEG-1 的标准比 H.263 早出现,MPEG-1 制定于 1992 年,主要用途为:视讯会议、影像电话、计算机游戏与支援第一代的CD-ROM。MPEG-1 被设计来支援大部份的影像与 CD-ROM 的音效,传输速度为 1.5 Mbps (30 fps)。
除此之外,MPEG-1 也支援 playback,例如快转、倒带或是跳跃,这也是 MPEG-1 好用的地方。稍后我们会简单介绍一下 MPEG-1 的原因,以明白 MPEG-1 如何做到这些功能。
MPEG-2 标准
MPEG-2 的标准出现于 1994 年,MPEG-2 相容于 MPEG-1。MPEG-2 的出现并不是为了要取代 MPEG-1 的旧标准,而是要加强 MPEG-1 不足的地方。因此 MPEG-2 更能升任其它工作环境,例如 HDTV、视讯广播。
同时,MPEG-2 的解析度也支援到 HDTV 1280x720。在音效方面,MPEG-2 也支援到 6 个频道 (MPEG-1 只支援 2个频道)。MPEG-2 的传输速度也提升至 2Mbps ~ 10 Mbps,因此需要 4x 的 CD-ROM,但也因此 4x CD-ROM只能储存 18 分种的影像,所以我们利用 DVD-ROM 来储存 MPEG-2 格式的影像,而且 DVD-ROM 也支援 Dolby 音效。
MPEG-4 标准
MPEG-4 的标准在 1993 年被提出,主要的应用用途比较广,包括:视讯会议、影音邮件、无线装置等等,支援的传输速度为 8Kbps ~ 35Mbps。
MPEG-4 可以传送影像的物件,而不是只有影像的 "frame",例如一连串的动作指令。因此,MPEG-1 与 MPEG-2 皆是"frame-based" 的标准,而 MPEG-4 则是 "object-based" 的标准,未来在网络与多媒体的应会也会更普遍。
MPEG-4 目前在 Linux 上已经有 OpenMPEG 的专案计画,发起本计画的目地在希望可以在 Linux 上发展完整的 MPEG-4 支援环境。
Video Streaming 的网络技术
要建置一个完整的 Video Streaming 环境,在整体来看,要准备的硬件包括:服务器、CCD、影像补捉卡等等,而在底层的技术面方面,除了前面提到的影像编码技术外,也要配合通讯协定才能实作出 Video Streaming 的应用程式。
Video Streaming 的方式
Video 在做 Streaming 时,有三种方式可以应用:broadcasting、unicasting、multicasting。
broadcasting 的方式比较单纯,他是在 LAN 上直接将一个个的影像封包丢到网络上 (server 端),再由 client的应用程式自网络上取回封包播放。但网络硬件层上,仍有许多需要考虑的问题,例如在 Shared Non-Switched Enthernet上时,就会发生一些小问题。
unicasting 与 multicasting 都是属于 IP 的传输方式。unicasting 采取 1 对 1的方向传影像给远端,称为 Video-on-Demand (VoD),multicasting 则是 1 对多的传输方式,称为Near-Video-on-Demand (NVoD)。未来 IPv6 将支援 IP Multicasting,因此 VideoStreaming 的应用将更为广泛。
IPv6
IPv6 全名为 IP version 6,未来将取代目前所使用的 IPv4。IPv6 新增许多对多媒体传输的支援,例如 multicasting、authentication/encryption等。不过目前尚仍未全面升级,所以应用仍受限。
UDP 通讯协定
UDP 全名是 Universal Datagram Protocol,UDP 通讯协定是 Video Streaming 的基石。UDP 与 TCP 不同的是,UDP 并没有错误检查,不过这在 Video Streaming 的应用是影向不太的。
RTP 通讯协定
RTP 全名为 Real-Time Protocol,RTP 是在 UDP 封包之前多加 10 bytes 的档头,里面记载有时间、序号、压缩型态等信息。RTP 是目前大多数 Video Streaming 软件所使用的通讯协定。
RTP 可用来针对各种不同的多媒体格式做 Streaming 的工作,因为我们将影像分解成数个 RTP封包再传送出去,因此会遇到许多网络技术常会遇到的问题。例如,因为封包送达的时间不一,造成播放时会画面不流畅的现像,因此,在播发时就必须使用一个缓冲区 (playout buffer) 来暂时存放并处理网络上接受到的封包。
由网络上接收的影像封包因为彼此之间到达的时间间隔不同 (Synchronous Data Packets),所以必须利用缓冲区将这些封包做缓冲,让彼此之间的时间间隔一样 (Isochronous Data Packets)。
MPEG-1 的原理
MPEG-1 的编码原理大家都应该要认识一下。MPEG-1 将影像分成一个 Group,即 GOP (Group ofPictures),每个 GOP 有一个 Entry Point,称为 I-frame,每个 I-frame 的大小为 15KB,另外还有P-frame 与 B-frame。
I-frame 称为 Independent-frame,为每个 GOP 的起点,紧接着的是二个 B-frame,B-frame 称为Bi-directional frame,每个 B-frame 大小为 3KB,每二个 B-frame 之间再插入一个 P-frame,即Predictive-frame,每个 B-frame 的大小为 8KB。
GOP 共有三种不同的 frame,每种 frame存放的影像与性质皆不同,这在以后我们实做程序时会再做更清楚的介绍。例如,我们要将影片快转时,可以忽略掉所有的 B-frame 与P-frame,只拨放 I-frame,如此一来便可以节省许多贵宝的网络频宽与时间,但前提是,I-frame必须存放主要的影像资料,事实上也是如此。
本期结语
本篇文章主要的目的是要让大家对影像的一些标准与 Video Streaming 所使用的通讯协定有一定的认识,更多与影像有关的内容也会陆续为大家做介绍。
下一期我们要介绍更多有趣的主题,包括 Linux 核心里的 video4linux,与 Linux 环境下的影像专案与好用的 Video Streaming 应用程式。



没有评论: