我們要做一款播放器首先是要對以上知識要了解的。
公司的業(yè)務涉及最多的是rtsp這塊。服務器端為rtsp流媒體服務器,客戶端也就是播放器庫采用FFMpeg進行解碼、OPenGL ES進行YUV視頻數(shù)據(jù)渲染。
播放器庫與服務器端進行交互,涉及到RTSP協(xié)議的請求,傳輸層協(xié)議采用的TCP、UDP協(xié)議,所以要對TCP連接的三次握手要熟悉,這其中也就涉及到網(wǎng)絡編程中的SOCKET編程知識了,BSD socket編程是需要掌握的。
播放器庫對從服務器上請求到的音頻、視頻rtp包,要進行解包,就是去掉一些協(xié)議的頭獲取到音視頻數(shù)據(jù)段。獲取到這些數(shù)據(jù)后,不能直接播放,需
要進行解碼操作。視頻解碼出來一般為Planar 4:2:0 YUV格式。要顯示YUV視頻圖像就需要利用OPenGL ES進行渲染了。
播放器在工作時,視頻數(shù)據(jù)要進行解碼放入數(shù)據(jù)緩存區(qū),數(shù)據(jù)緩存區(qū)的解碼后的數(shù)據(jù)被取出交給OpenGL進行渲染,所以多線程是必不可少的環(huán)節(jié)
了。開辟2個線程,一個線程進行解碼處理,另一個線程進行視頻數(shù)據(jù)的渲染。多線程中常使用的是POSIX thread多線程編程。
雖然開發(fā)的iOS播放器庫,但是底層的東西大部分是c語言的東西,比如用到開源庫FFMpeg,以及一些上層的對FFMpeg的封裝,數(shù)據(jù)緩存區(qū),所以c語言和數(shù)據(jù)結構的基礎要扎實,什么函數(shù)指針,內(nèi)存分配與管理,數(shù)據(jù)結構中的單鏈表那得玩得比較溜。
總結一下,需要具備的知識有
rtsp、sdp、tcp、udp、ip協(xié)議(rtsp的DESCRIBE、OPTION、SETUP、PLAY、PAUSE、TEARDOWN;tcp連接的三次握手/斷開的四次握手)
socket(bsd socket)
多線程(posix thread)
opengl es
FFmpeg(知道用它來解碼)
YUV420(知道它的原理與格式)
音視頻同步(時間戳的處理)
C語言指針(void *、函數(shù)指針、回調(diào)函數(shù))
內(nèi)存管理(堆區(qū)、棧區(qū)、靜態(tài)區(qū)、內(nèi)存對齊)
數(shù)據(jù)結構(單鏈表)