視頻播放的基本原理 分類: arm-linux-Ubuntu 2015-03-20 11:58 419人閱讀 評論(0) 收藏

視頻播放的基本原理html

VLC是一個功能強大的玩意,能作不少有意思的事情。緩存

最簡單的,從界面打開一個文件播放,也能夠在命令行下使用,如
C:/Program Files/VideoLAN/VLC>vlc.exe test.ts服務器

獲取內置的幫助,會寫到vlc-help.txt
C:/Program Files/VideoLAN/VLC>vlc.exe -hmarkdown

獲取更詳細的幫助,有大量的選項介紹
C:/Program Files/VideoLAN/VLC>vlc.exe -H網絡

在線使用幫助
http://www.videolan.org/doc/play-howto/en/play-howto-en.html
http://www.videolan.org/doc/streaming-howto/en/streaming-howto-en.html架構

搜索並顯示可用的模塊列表
C:/Program Files/VideoLAN/VLC>vlc.exe -ltcp

Windows下,默認狀況,VLC的配置文件在 %APPDATA%/vlc/vlcrc
%APPDATA%在XP下一般是 C:/Documents and Settings/用戶名/Application Data
Linux下,在用戶home目錄的/.vlc/中ide

vlc的選項徹底能夠經過修改vlcrc來設置,界面只是略微方便一點模塊化

重置全部選項到默認狀態
C:/Program Files/VideoLAN/VLC>vlc.exe –reset-configoop

VLC從vlcrc中指定的plugin-path,以及當前目錄的modules和plugins目錄來遞歸查找plugin

VLC的大部分功能都是經過plugin來實現的。VLC默認有大量的動態插件,例如官方VLC 0.8.6e有210個插件。爲了加快啓動速度,vlc會在%APPDATA%/vlc/cache中緩存plugin的列表,選項plugins-cache=0能夠禁止緩存plugin

打開一個UDP組播流,組播組 239.255.1.1,端口 4567,默認端口1234
對於rtp協議,VLC會自動識別,寫udp仍是rtp都沒問題
C:/Program Files/VideoLAN/VLC>vlc.exe udp://@239.255.1.1:4567

在本地UDP端口 888 接收流, 「@」表示綁定一個地址,而不是鏈接該地址
C:/Program Files/VideoLAN/VLC>vlc.exe udp://@888

串流輸出,就是在播放的時候,以某種方式向外傳送視頻,在打開界面
的串流/保存 中設置會比較方便
例如,循環播放test.ts, 以rtp方式傳送到224.1.1.1端口1234, 同時顯示視頻
vlc.exe test.ts –loop :sout=#duplicate{dst=std{access=rtp,mux=ts,dst=224.1.1.1:1234},dst=display}
例如,接收UDP端口888,數據所有保存到C:/dump.ts
vlc.exe udp://@888 :demux=dump :demuxdump-file=」C:/dump.ts」

關於Windows下視頻輸出模塊
Direct3D :效果比DirectX差一點,可是方便截圖,也能夠在圖像上實現alpha
DirectX:效果最好,利用DirectX的顯示加速
OpenGL:在不一樣的硬件上表現不太同樣
WinGDI:最慢的一種,不須要顯卡加速
caca:用彩色的Assic字符來顯示,頗有意思
臨時啓用某個視頻輸出,能夠這樣
C:/Program Files/VideoLAN/VLC-0.8.6e>vlc test.ts –vout=caca

ActiveX控件
官方發佈的VLC自帶ActiveX控件 axvlc.dll,註冊以後能夠方便的在應用程序和網頁
中使用VLC,註冊的辦法是
C:/Program Files/VideoLAN/VLC-0.8.6e>regsvr32 axvlc.dll
ActiveX VLC的使用方法能夠參考源代碼中ActiveX目錄的README.TXT和test.html
ActiveX控件的接口有初版和第二版,初版簡單,功能少,已經再也不維護
建議用第二版本,功能多一點

Mozilla Plugin
你還能夠在Windows和Linux的Firefox中使用VLC。Windows下能夠在安裝VLC的時候選上
Mozilla plugin,事實上它作的就是在HKLM_Software_MozillaPlugin鍵下添加一個VLC的子鍵。
Linux下就不太清楚了,可是你能夠把libvlcplugin.so(或者叫npvlc.so)和插件目錄
放到Firefox的plugins目錄,來使之生效。
一樣這適用於基於Xulrunner的應用程序,事實上像 Miro、SongBird等xul應用都是用的
這個插件。
與ActiveX相似的,VLC的Mozilla Plugin也有兩套接口,建議用新的第二版。

註冊表
在Windows下VLC只使用不多量的註冊表的信息,最重要的一條是HKLM_Software_VLC鍵
下的InstallDir項,VLC的Mozilla Plugin和ActiveX控件經過這一項來定位其插件的目錄

Telnet、Http控制
對VLC來講,控制界面都是Interface類的模塊,你可使用各類控制模塊。Windows下
默認使用的是wxwidgets圖形界面,你還可使用http、telnet等界面,來遠程控制VLC,
夠酷吧?若是你用VLC在服務器上專門做視頻流轉發一類的事情,這種遠程界面
能夠幫上大忙。

視頻過濾器
0.8系列中有多達13種視頻過濾器,爲視頻添加各類效果和特殊處理。用的比
較多的是反交錯deinterlace過濾器,在觀看MPEG2視頻時頗有用。

Skin2界面
一個漂亮一點的,能夠換膚的界面,以爲它不太穩定不多用。

其餘的
播放DVD、VCD光盤,打開DirectShow設備,播放當前屏幕…不少好玩的功能能夠去摸索一下

一些問題

目前的VLC沒法播放Real視頻,如rm、rmvb。其實從0.9版本的VLC開始能夠依賴其餘解碼
器播放。但就目前測試的狀況來看,順序播放沒問題,可是拖動則效果不好

RTSP的播放,拖動有問題,在獲取播放位置時有缺陷。例如和達爾文服務器的配合。

視頻播放的基本原理

當初看VLC代碼花了很多時間,其中很大的緣由是不太瞭解視頻播放的基本原理。如今看來,幾乎全部的視頻播放器,如VLC、MPlayer、Xine,包括DirectShow,在播放視頻的原理和架構上都是很是類似的,理解這個對理解VLC的源碼會有事半功倍的效果。
大體的來講,播放一個視頻分爲4個步驟:
1.  acess 訪問,或者理解爲接收、獲取、獲得
2. demux 解複用,就是把一般合在一塊兒的音頻和視頻分離(還有可能的字幕)   
3. decode 解碼,包括音頻和視頻的解碼
4. output 輸出,也分爲音頻和視頻的輸出(aout和vout)
拿播放一個UDP組播的MPEG TS流來講吧,access部分負責從網絡接收組播流,放到VLC的內存緩衝區中,access模塊關注IP協議,如是否IPv六、組播地址、組播協議、端口等信息;若是檢測出來是RTP協議(RTP協議在UDP頭部簡單得加上了固定12個字節的信息),還要分析RTP頭部信息。這部分能夠參看VLC源碼 /modules/access/udp.c 。在同目錄下還能夠看到大量的access模塊,如file、http、dvd、ftp、smb、tcp、dshow、mms、v4l…等等
而demux部分首先要解析TS流的信息。TS格式是MPEG2協議的一部分,歸納地說,TS一般是固定188字節的一個packet,一個TS流能夠包含多個program(節目),一個program又能夠包含多個視頻、音頻、和文字信息的ES流;每一個ES流會有不一樣的PID標示。而又爲了能夠分析這些ES流,TS有一些固定的PID用來間隔發送program和es流信息的表格:PAT和PMT表。關於TS格式的詳細信息能夠去google一下。
VLC專門作了一個獨立的庫libdvbpsi來解析和編碼TS流,而調用它的代碼能夠參見VLC源碼 /modules/demux/ts.c。
其實之因此須要demux,是由於音視頻在製做的時候實際上都是獨立編碼的,獲得的是分開的數據,爲了傳輸方便必需要用某種方式合起來,這就有了各類封裝格式也就有了demux。
demux分解出來的音頻和視頻流分別送往音頻解碼器和視頻解碼器。由於原始的音視頻都是佔用大量空間,並且冗餘度較高的數據,一般在製做的時候就會進行某種壓縮。這就是咱們熟知的音視頻編碼格式,包括MPEG1(VCD)、MPEG2(DVD)、MPEG四、H.26四、rmvb等等。音視頻解碼器的做用就是把這些壓縮了的數據還原成原始的音視頻數據。VLC解碼MPEG2使用了一個獨立的庫libmpeg2,調用它的源文件是 /modules/codec/libmpeg2.c。VLC關於編解碼的模塊都放在/modules/codec目錄下,其中包括著名的龐大的ffmpeg。
解碼器,例如視頻解碼器輸出的是一張一張的相似位圖格式的圖像,可是要讓人從屏幕看獲得,還須要一個視頻輸出的模塊。固然能夠像一個Win32窗口程序那樣直接把圖像畫到窗口DC上——VLC的一個輸出模塊WinGDI就是這麼幹的,可是一般這太慢了,並且消耗大量的CPU。在Windows下比較好的辦法是用DirectX的接口,會自動調用顯卡的加速功能。
這樣的功能分解使得模塊化更容易一點,每一個模塊住須要專一於本身的事;從總體來講功能強大並且靈活。
可是事情老是不會那麼簡單。就拿access來講,媒體的訪問是分層的,如RTSP就涉及到IPv四、TCP、UDP、RTCP、RTSP等多個層次的協議。有些視頻格式包括了傳輸、封裝格式和編輯碼格式如MPEG系列,有些封裝格式是獨立的容器,可是不少人會誤解它是編解碼格式,如mkv、avi這些。
音頻和視頻在demux以後就是獨立的,可是須要有一套機制把它們同步起來。同時咱們須要有一套機制來控制速度、暫停、中止、跳進,獲取各類媒體信息,這些都是很複雜而又很重要的事情。
另外也許須要在某個地方插入一些修改,來實現某種效果。如音頻的EQ,視頻的亮度調整之類的,VLC專門設計了access_filter、audio_filter和video_filter類型的模塊來作這一類事情。
VLC比較獨特的地方是集成了原來的VLS的功能,這依賴於VLC中stream_output類型的模塊,它們能夠把正在播放的視頻以某種方式從新轉碼和發送出去,如http、UDP、文件等等。
MPlayer的結構與此是相似的,如/stream目錄對應的是access的功能,/mpdemux對應的demux功能,/libmpcodecs是解碼器,/libvo和/libao2分別是視頻和音頻的輸出。
DirectShow也是相似的,不過度類更多一些更復雜一點。DirectShow裏面的模塊叫作「filter」,filter之間經過」pin」來鏈接。access的模塊對應於DirectShow中的Source FIlter,這一類Filter只有輸出pin沒有輸入pin。demux模塊對應於splitter filter,這種filter有一個輸入pin,多個輸出pin。解碼模塊是一類transform filter,有一個輸入pin、一個輸出pin,輸出模塊對應於readering filter,有一個輸入pin,沒有輸出pin。固然transform filter不必定是解碼器,也多是某**重點內容**種其餘的處理。
相關文章
相關標籤/搜索