Linux 的應用(刊載於 PC2000 雜誌四月號) -- Video Streaming 探討 (1)
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),談到這些技術,應用最廣泛的編碼標準底下四種:
- ) H.261
- ) H.263
- ) JPEG, MJPEG
- ) MPEG
底下將分別簡單介紹這四種編碼技術。
H.261 標準
H.261 的影像編碼標準出現在 1990 年的 ITU。一開始的用途主要是支援影像電話 (video phone) 與視訊會議 (video conferencing)。H.261 的格式有二種,分別有不同的解析度:
- ) QCIF:176x144
- ) 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 的標準共支援五種不同的解析度,分別為:
- ) Sub-QCIF:128x96
- ) QCIF:176x144
- ) CIF:352x288
- ) 4CIF:704x576
- ) 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 必須存放主要的影像資料,事實上也是如此。
本期結語
本篇文章主要的目的是要讓大家對影像的一些標準與 Video Streaming 所使用的通訊協定有一定的認識,更多與影像有關的內容也會陸續為大家做介紹。
下一期我們要介紹更多有趣的主題,包括 Linux 核心裡的 video4linux,與 Linux 環境下的影像專案與好用的 Video Streaming 應用程式。