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