Linux 的应用 -- Video Streaming 探讨1

来源:互联网 发布:青岛淘宝书城 编辑:程序博客网 时间:2024/05/21 17:15
Linux 的应用 -- Video Streaming 探讨 (1)
作者: 陈俊宏
www.jollen.org
Video Streaming 的技术已经出现多年,在 Internet 上的应用也已经相当广泛,而利用 Linux 建构 Video Streaming Server 也是相当热门的话题。如果您想了解什么是 Video Streaming,本文对 Video Streaming 的观念与技术将做了清楚而基本的介绍

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,我们称这样的技术为 Video Streaming 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 to 30)。
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 图档。许多 Video Streaming 的场合,像是简单的视讯会议软件都会使用 MJPEG 来取代 MPEG,原因无它,因为 MJPEG 格式简单,但缺点是不支持声音。

MPEG-1
标准
MPEG 的标准由 ISO (International Standards Organization) 所制定,全名为 Moving Pictures 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,因此 Video Streaming 的应用将更为广泛

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 of Pictures),每个 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 必须存放主要的影像数据,事实上也是如此