标题: Linux Video Streaming [打印本页] 作者: lenlydia 时间: 2006-08-13 21:03 标题: Linux Video Streaming
Linux Video Streaming 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),談到這些技術,應用最廣泛的編碼標準底下四種:
Data network (例如 Internet,或任何連結 server-client 的媒介)
那麼我們在這一系列 Video Streaming 主題介紹的有那些呢?從一開始的名詞介紹、影像擷取、RTP 通訊協定,我們將重心放在 contente 與 data network 上。當然我們系列主題名為「Linux 的應用」,最關鍵的地方則是在如何在 Linux 環境下設計影像擷取程式。
對於 data network 的部份因為與 Linux 較無關,但也是 Video Streaming 的重點主題之一,所以也介紹了 jrtplib 這套程式庫給大家,在底下的部份也會補充 Nsync 這套 toolkit。
而 server 端似乎是我們著墨不深的地方,但也沒關係,在這最後一篇的文章裡,我們針對理論方面做補充的介紹,我們將以 Video Conferencing 實作時,實務上會面臨的主題來做解,包括:多媒體資料的儲存、OS 的磁碟排程 (SCAN-EDF),以做為您搜尋參考資料的起頭。
在 client 方面,我們在最後的完整版範例程式時,示範了如何利用 SDL 將擷取下來的影像資料秀在螢幕上。這裡也會配合了上一篇所介紹的 mmap 擷取方式,以將影像資料填入 SDL 的 display 結構方式秀圖。 Video Streaming 的開始
我們一開始就介紹了 Video Streaming 是一種經由網路來撥放影音檔案的技術,Video "Streaming" 的基本概念爲「一邊下載一邊撥放」,我們稱之爲「Play as received」。
經由 Internet 如果要收看遠端伺服器的電影檔案,最原始的做爲是「下載後再撥放」,也就是經由 FTP 或 HTTP 將整個檔案下載至本地端後再利用撥放程式來撥放,我們稱之爲「Play after download」。
舉個最簡單的情況,你可能在下載 MP3 之前想要試聽一下音樂的內容,而下載音樂片段的方式又顯得不夠友善,這時如果利用 Video Streaming 的技術來讓網友視聽,不但方便,而且不必浪費時間來下載不喜歡的音樂的。
除此之外,大家最熟悉的莫過於在線上即時播放影片的 real player了。 Real Video 產品介紹
Real Video 是 Real Networks 公司的產品,Real Video 主要支援了 video-on-demand*1 的功能。Real Video 可以讓我們經由網站來播放串流影像 (streaming video)。
由於我們的最終目的是實作出一個可以做 video streaming 的軟體,所以在這裡我們將以 Real Video 做為標竿,並以 Linux 為基礎來設計 video streaming 的軟體。 其它經典的 streaming 範例程式
網路上有幾套很值得玩味研究的相關開放原始碼軟體,我們也曾經提過。VIC 和 VideoLAN 則是其中絕對優秀的教學範例。 VIC
VIC 也是屬於 Open Source 的軟體。VIC 全名為video conferencing,故名其義,VIC 是一種視訊會議的軟體。VIC 是由加州柏克來大學的 Network Research Group 所發展。
VIC 是相當棒非常適合用來研究 Video Streaming 的 Open Source 軟體,主要是因為 VIC 幾乎包含了 Video Streaming 相關的技術。
VIC 值得我們研究的原因是因為 VIC 支援了底下所列的功能:
IPv6
使用 video4linux 的影像擷取功能
H261、H263 與 H263+ codec
Software JPEG 與 BVC 編碼
Raw YUV packetiser/codec
RTIP/RTP 通訊協定
the IP Multicast Backbone (MBone)
支援 video4linux 的 mmap
這些特色幾乎已經包括 Video Streaming 所應具備的技術了,基於這些特點,VIC 的原始程式碼相當吸引人,因此有意研究 Video Streaming 的 programmer 應該好好閱讀一下 VIC 的原始程式碼。 VideoLAN
VideoLAN 是一個可以做 MPEG 與 DVD 擴播 (broadcast) 播放的軟體,VideoLAN 分成二個部份,一個是 VLAN server,另一個則是 vlc 用戶端播放程式。
VLAN server 將 DVD 與 MPEG 影像利用 broadcast 方式擴播到區域網路上,使用者端再利用 vlc 接收封包並播放。這樣做的好處是可以減少重覆的 I/O 動作,VLAN server 將影像擴播出去後,區域網路上的用戶端再利用 vlc 接收封包並播放。
VideoLAN 支援 X11、SDL、Linux framebuffer、GGI、BeOS API、MacOS X API 播放方式,並且支援 DVD 與 AC3 (杜比音效)。 影像編碼技術介紹 (coded)
目前學術界已經發展出許多處理影像訊號壓縮及編碼的技術 (codecs),談到這些技術,應用最廣泛的編碼標準底下四種:
H.261
H.263
JPEG, MJPEG
MPEG
本文第一篇文章就是在對這四種編碼技術做簡單的介紹。 data network 的技術主題
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 的應用將更為廣泛。
在通訊協定方面,我們也介紹了 RTP。
RTP 全名為 Real-Time Protocol,RTP 是在 UDP 封包之前多加 10 bytes 的檔頭,裡面記載有時間、序號、壓縮型態等資訊。RTP 是目前大多數 Video Streaming 軟體所使用的通訊協定。
RTP 可用來針對各種不同的多媒體格式做 Streaming 的工作,因為我們將影像分解成數個 RTP 封包再傳送出去,因此會遇到許多網路技術常會遇到的問題。例如,因為封包送達的時間不一,造成播放時會畫面不流暢的現像,因此,在播發時就必須使用一個緩衝區 (playout buffer) 來暫時存放並處理網路上接受到的封包。
由網路上接收的影像封包因為彼此之間到達的時間間隔不同 (Synchronous Data Packets),所以必須利用緩衝區將這些封包做緩衝,讓彼此之間的時間間隔一樣 (Isochronous Data Packets)。
其它重要的通訊協定像是 SIP、或是 FEC (forward error correction) 除錯技術,都是一定要去研究的主題。 影像擷取卡
在 Linux 下設計影像擷取程式,當然一定要配備有適合的影像擷取卡。
我們曾經介紹給大家的是 Osprey 100 這張影像擷取卡。Osprey 100 是 Real Networks 公司所推薦配合他們產品的一張影像擷取卡,配合 Osprey 100 與 RealNetworks 的產品我們可以利用 broadcast 或 on-demand 做到實況轉播 (live) 的功能。
Osprey 100 在硬體功能上可以支援到每秒 30 個畫面 (fps -- frame per second),並且支援 NTSC 與 PAL 輸入。
不過在實作上,筆者並不使用 Osprey 100。筆者使用的影像擷取卡是 ,這張卡算是比較「俗」一點的卡,但是也有好處,因為在 Linux 上很容易安裝。
以筆者這張卡為例,使用的是 Brooktree Corporation 的卡,所以只要安裝 bttv 模組即可,同時,bttv 模組在 Linux kernel 2.2.17 下也會用到 i2c-old 與 videodev 兩個模組,所以也要一併安裝。在命令列下,安裝這三個模組的命令為:
linux# insmod i2c-old
linux# insmod videodev
linux# insmod bttv
當然要確定 Linux kernel 有編譯這三個模組的支援,然後再把這三個模組加到 /etc/modules.conf (Red Hat 7.0) 裡。
不同版本的 kernel 所要安裝的模組不一定相同!還請注意,例如 i2c 相關模組就是如此。 Linux 上可用的影像擷取卡
在http://www.linhardware.com/db/searchproduct.cgi?_catid=17 網頁上可以找到在 Linux 上支援程度比較好的幾張影像擷取卡。而一般 Linux 上較受歡迎的影像擷取卡則是 Hauppauge 的幾張卡, 筆者使用的也是 Hauppauge 的卡。
在 linhardware 網站上可以找到底下六張卡: