播放器的基本原理
轉(zhuǎn)載地址:
http://blog.csdn.net/iloveyin/article/details/24366129
播放器解決了視頻播放的問題。通常來說,解決問題最好的辦好就是大而化小,小而化無。因?yàn)檎麄€(gè)播放過程是一個(gè)復(fù)雜的過程,所以播放器也采用分而治之的辦法。
簡單來說,這個(gè)大問題可以分解為四個(gè)小問題。
1,數(shù)據(jù)接收;
2,數(shù)據(jù)解析;
3,數(shù)據(jù)解碼;
4,數(shù)據(jù)輸出。
我會對mplayer和vlc這兩個(gè)開源播放器的代碼結(jié)構(gòu)來說明這四個(gè)問題。
一,數(shù)據(jù)接收(access)
自然,我們不能無中生有,要處理數(shù)據(jù),總要有數(shù)據(jù)來源才行。但是數(shù)據(jù)來源的渠道有很多種。
可能是硬盤文件,可能是dvd光盤,也可能是http/httplive數(shù)據(jù)包,也可能是rtp數(shù)據(jù)包(vod),或者ftp,廣播電視的ts流等等。
所以第一步我們要處理的問題就是如何把不同的數(shù)據(jù)來源統(tǒng)一一個(gè)接口。這需要不同數(shù)據(jù)包解析器,也就是實(shí)現(xiàn)不同的協(xié)議來滿足這個(gè)需求。
對于mplayer,相關(guān)的代碼在strearm,
對于vlc,相關(guān)的代碼在/modules/access
查看代碼目錄,里面文件名可以和我們前面說的一些數(shù)據(jù)來源一一對應(yīng)。所以如果我們需要實(shí)現(xiàn)某種協(xié)議,大抵是可以從這里獲取一些實(shí)現(xiàn)思路的。
二,數(shù)據(jù)解析(demux)
有了數(shù)據(jù)了,我們還要解析這些數(shù)據(jù)。
為了方便媒體文件的傳輸,我們要把音頻,圖像,同步信息等等一堆信息放到一起(就是上一篇說的容器),這個(gè)過程就是mux(multiplex)。
但是為了方便媒體文件的處理,我們又需要解復(fù)用demux(Demultiplexer)
Container是為了解決的傳輸而誕生的,demux就是為了解析而誕生的。
不同的容器需要不同的解析器,就是不同的demux接口,為了方便編程,我們同樣需要統(tǒng)一接口。我們來看看mplayer和vlc是如何做的。
mplayer把相關(guān)代碼放在了libmpdemux里面。
vlc把相關(guān)代碼放在/modules/demux里面。
這兩個(gè)代碼統(tǒng)一各種容器的解析方式(就是我們常見的avi,ts,mkv的解析)。
不過需要注意的是,這些代碼很大一部分都是warp的ffmpeg/libavformat里面的代碼。
三,解碼(decode)
上面那個(gè)過程把音視頻數(shù)據(jù)分離,我們得到的數(shù)據(jù)可能是mpeg-2/h.264壓縮的視頻,也可能是mp3/aac/ac-3等音頻數(shù)據(jù)。
但是這些數(shù)據(jù)都是壓縮過的,我們知道,屏幕是由一個(gè)一個(gè)的點(diǎn)結(jié)成的,這一個(gè)一個(gè)點(diǎn)又是由rgb來描述的,聲卡是處理一個(gè)一個(gè)音頻幀的。
這個(gè)過程我們要解決的問題就是把壓縮過的數(shù)據(jù)還原出來。如何還原?沒錯(cuò),靠我們的解碼器。
上一篇說了不同的解碼標(biāo)準(zhǔn),現(xiàn)實(shí)中的情況是,我們有了一個(gè)標(biāo)準(zhǔn),但是我們可能根據(jù)這個(gè)標(biāo)準(zhǔn)來實(shí)現(xiàn)不同的解碼器。就像我們有一張桌子的草圖,但是我們做的桌子卻有不同的顏色一個(gè)。標(biāo)準(zhǔn)有了,實(shí)現(xiàn)可以不同。
mplayer把這塊代碼放到libmpcodecs里
vlc把這塊代碼放到/modules/codec里。
不過要指出的是,這兩塊代碼同樣大部分是在warp ffmpeg/libavcodec。
ffmpeg真是做為神一樣庫而存在啊。
四,數(shù)據(jù)輸出(render)
準(zhǔn)備好了解碼后的數(shù)據(jù),就差最好一步輸出了。
視頻通常會解碼為yuv數(shù)據(jù),音頻通常會解碼為pcm數(shù)據(jù)。然后我們把這些數(shù)據(jù)分別放到屏幕和聲卡里,播放過程就算完成了。
同樣,數(shù)據(jù)輸出也有很多渠道,也需要統(tǒng)一。
圖像可能會輸出到sdl,x11或者framebuffer,或者directfb,也可能是wingdi。
音頻可能會出到oss,alsa,等等。
為了統(tǒng)一這些,vlc和mplayer同樣warp了一些庫,
mplayer放到libvo與libao
vlc放到/modules/audio_out與/modules/video_out。
總結(jié)
- 上一篇: 记,罗盘时钟使用js实现
- 下一篇: 福晰阅读器打开PDF时如何不展开目录