一般情況下,播放一個音視頻分為4個步驟 1、access訪問 2、demux解複用 3、decode解碼 4、output輸出 access:訪問
可以理解為接收、擷取、得到資料資源,包括解析訪問源(url),
使用http協議,rtsp協議,ftp協議,建立串連,擷取資料。 demux:解複用
就是把通常合在一起的音頻和視頻分離,當然也有可能有字幕。通過分析資料包頭來判斷是什麼資料檔案,需要用什麼解碼格式。
為什麼需要demux
其實之所以需要demux,是因為音視頻在製作的時候實際上都是獨立編碼的,得到的是分開的資料,為了傳輸方便,必須用某種方式結合起來,這就有了各種封裝格式,也就有了demux。 decode解碼
包括音頻和視頻解碼,或者軟體解碼和硬體解碼。 out輸出
分為音頻和視頻的輸出(aout和vout)
如,播放一個UDP組播的MPEG TS流,
access部分負責從網路接收組播流媒,放到播放器的記憶體緩衝區,access模組關注ip協議,如是否IPv6,組播地址,組播協議,連接埠等資訊。如果檢測到是RTP協議(RTP協議是在UDP頭部簡單加上12個位元組)
而demux部分首先要解析TS流媒的資訊。TS格式是MPEG2協議的一部分,一般TS通常是固定188位元組的packet,一個TS流中可以包含多個program(節目),一個program可以包含多個視頻、音頻、和文字資訊的ES流,每個ES流會有不同PID標識,而為了可以分析這些ES流,TS有一些固定的PID用來間隔發送program和ES流得表格,PAT和PMT表。
對於VLC播放器,使用libdvbpsi來解析和編碼TS流。(調用代碼可以參考/modules/demux/ts.c)
demux分離出來的音頻和視頻流分別送往音頻解碼器和視頻解碼器,因為原始的音視頻都是佔用大量的空間。而且冗餘度較高的資料。通常在製作的時候就會進行某種壓縮。這就是我們知道的音視頻編碼格式,H.264,rmvb,mkv。音視頻解碼器作用就是把壓縮的資料還原成原始的音視頻資料。(VLC編解碼模組都在/modules/codec目錄下)。
最後output模組,視頻解碼器輸出的是一張一張的類似位元影像格式的映像,但是要讓人從螢幕看到,還需要一個視頻輸出的模組。如用SDL顯示。音頻也是一樣,需要將pcm等資料轉化成音聲。 VLC源碼
VLC(Video Lan Clent)是一個完整的多媒體架構,最大特點是可以根據需要動態載入許多外掛程式模組,可使用視訊傳輸,封裝和編碼格式。架構核心是利用程式將各模組連結起來。對輸入媒體資料,經過各模組處理後輸出。
vlc目錄結構: doc : 協助文檔 include:VLC標頭檔 lib:VLC對外實現函數目錄,和src一起使用 m4:AutoMake和AutoConf的宏檔案 modules:VLC外掛程式目錄 share:表徵圖、指令碼 src:源碼 contrib:存放可能用到的第三方軟體資訊 compat:存放可能使用的函數
access dshow:DirectShow擷取外掛程式,用於windos平台 dvb:使用V4L2API的輸入模組,用於DVB-S/C/T媒體流 mms:用於TCP,UDP的MMS和HTTP擷取模組 rtsp:基於即時資料流傳輸協議 screen:擷取螢幕映像的輸入模組 vcd:擷取VCD資料的輸入模組 vcdx:擷取VCD輸入模組,可以導航,靜止
audio-filter channel-mixer:各種混合器,解碼器,如Dobly解碼器 converter:定點或浮點音頻格式轉換 resample:各種音頻重採樣模組
audio-mixer
audio-output
codec dmo :一個DirectMediaObject解碼器 avcodec:包含ffmpeg庫許多音視頻解碼器 spudec: RLE DVD小標題解碼
control
外掛程式控制播放器的各種介面:手勢、熱鍵、遠端控制和telnet
demux:不同解複用程式 asf :asf解複用器 avi :avi解複用器 mp4 :mp4解複用器 mpeg:mpeg解複用器 playlist:播放清單匯入模組
packetizer:打包模組,用於H264/AVC和MPEG 4音視頻流
video-chroma :映像格式裝換,如YUV轉RGB
video-filter:各種視頻濾波模組,如Deinterlace,Transform,Wall,Crop等。
video-output:視頻輸出模組
Src模組 libVLC:它是提供介面的庫,比如給VLC提供功能介面:流的輸入,音視頻輸出,外掛程式管理,線程系統。 Interface:包含與使用者互動的代碼,如按鍵和裝置彈出。 Playlist:管理播放清單的互動,如停止、暫停、下一個,或全部隨機播放。 Input:開啟一個輸入組件,讀包,解析它們並且將被還原的基本流傳遞給解碼器。 Video_output:初始化video顯示器。從解碼器得到所有的圖片和子圖片。將他們裝換成YUV或RGB進行播放。 Audio_output:初始化音頻mixer。如發現正確播放頻率,然後重新製作從解碼器接受過來的音訊框架。 Stream_output:類似Audio_output Misc:被libvlc其他部分使用雜項。如線程系統,訊息佇列,CPU探測,物件查詢系統,
視頻輸出:可以通過DriectX,X11,XVideo,SDL,FrameBuffer,ASCII