跨平臺ffmpeg播放器開發(fā)(一)音視頻基礎(chǔ)

前言

學(xué)習(xí)之前請容許我悼念下雷霄驊前輩,他的博客是我學(xué)習(xí)視頻編解碼資料的主要來源,雷霄驊前輩博客地址.我們主要是來學(xué)習(xí)FFmpeg和SDL,學(xué)習(xí)的第一階段我們要使用它們來做一款跨平臺的播放器,作者是從事iOS開發(fā)的,所以會將這個跨平臺播放器集成于iOS平臺,各位有什么好的建議可以在文章下方留言.FFmpeg主要是為了處理音視頻的編碼,而SDL則是為了展示畫面,至于具體的知識還是需要閱讀雷哥的博客去學(xué)習(xí).

零基礎(chǔ)學(xué)習(xí)音視頻編碼

  • 視頻解碼器(FFmpeg)

主要掌握幾個常用的FFmpeg解碼的函數(shù),主要實現(xiàn)H.264->YUV的轉(zhuǎn)換

  • 視頻顯示(SDL)

掌握SDL顯示視頻的函數(shù),實現(xiàn)YUV -> 設(shè)備屏幕

視頻播放器原理

  • 這是雷哥的一張圖,簡單介紹了視頻播放器原理.我們?nèi)粘I钪?視頻,音頻的結(jié)尾都會有類似.MP4之類的字符,這里就是他們的封裝格式.我們拿到這個視頻文件如果想播放的話,會將它解封裝成音頻壓縮數(shù)據(jù)和視頻壓縮數(shù)據(jù),在對這兩個數(shù)據(jù)進行解碼,獲得音頻采樣數(shù)據(jù)和視頻像素數(shù)據(jù),他們分別會送到我們的聲卡和顯卡最終到達播放設(shè)備,這里需要注意的是我們需要解決聲畫同步的問題,這個我們以后再說.


    視頻播放原理

封裝格式(MP4,RMVB评腺,TS,F(xiàn)LV朱浴,AVI)

封裝格式
  • 上圖講的是比較形象的封裝格式,同時也列舉了一些封裝格式的推出機構(gòu)以及目前使用的主要領(lǐng)域.下圖舉例了兩種比較代表性的封裝格式,他們的具體區(qū)別圖上可以看出,MPEG2 - TS這種封裝格式在損壞了某個TS包時依舊可以繼續(xù)播放,而FLV若損壞了文件頭那么他將無法播放.
最有代表性的兩種封裝格式

視頻編碼數(shù)據(jù)(H.264,MPEG2达椰,VC-1)

幾種視頻編碼
  • 上圖主要講的幾種視頻編碼數(shù)據(jù),通俗的講視頻編碼其實就是將我們?nèi)庋劭吹降拿恳环鶊D進行壓縮,壓縮成流,當(dāng)然編碼和壓縮肯定是不能畫等號的.這些流中也有集中壓縮散發(fā)我們后面會講到,壓縮和不壓縮前后體積大概相差百倍,這就對傳輸和存儲帶來了巨大的壓力,所以我們才要對其進行視頻編碼,在我們的日常生活中H.264目前是最常見的,所以許多做視頻的公司招聘上都會要求了解FFmpeg,H.264等.下面我們主要對H.264中最常見的IPB壓縮算法來進行介紹.
H.264格式簡介

IPB

視頻流中的每一張靜止的畫面其實都是一幀,在壓縮的算法中IPB算是一種比較常見的算法了.I幀是關(guān)鍵幀表示一副畫面的完整數(shù)據(jù),所以解碼的時候只需要自身就可以完成,P幀是差別幀表示當(dāng)前畫面和上一幅畫面的區(qū)別,上一幅畫面的數(shù)據(jù)IPB三種幀都有可能,他的解碼依賴于上一幀數(shù)據(jù),最終實際上還是要依賴I幀才能實現(xiàn)解碼.B幀是雙向關(guān)鍵幀,表示該畫面數(shù)據(jù)與上一幀和下一幀的區(qū)別,所以解碼的時候我們需要對他的前后幀都進行解碼,優(yōu)點是壓縮率高,但是處理起來計算機的處理負擔(dān)會比較大.

從上面的解釋看翰蠢,我們知道I和P的解碼算法比較簡單,資源占用也比較少砰碴,I只要自己完成就行了躏筏,P呢板丽,也只需要解碼器把前一個畫面緩存一下呈枉,遇到P時就使用之前緩存的畫面就好了,如果視頻流只有I和P埃碱,解碼器可以不管后面的數(shù)據(jù)猖辫,邊讀邊解碼,線性前進砚殿,大家很舒服啃憎。但網(wǎng)絡(luò)上的電影很多都采用了B幀,因為B幀記錄的是前后幀的差別似炎,比P幀能節(jié)約更多的空間辛萍,但這樣一來悯姊,文件小了,解碼器就麻煩了贩毕,因為在解碼時悯许,不僅要用之前緩存的畫面,還要知道下一個I或者P的畫面(也就是說要預(yù)讀預(yù)解碼)辉阶,而且先壕,B幀不能簡單地丟掉,因為B幀其實也包含了畫面信息谆甜,如果簡單丟掉垃僚,并用之前的畫面簡單重復(fù),就會造成畫面卡(其實就是丟幀了)规辱,并且由于網(wǎng)絡(luò)上的電影為了節(jié)約空間谆棺,往往使用相當(dāng)多的B幀,B幀用的多按摘,對不支持B幀的播放器就造成更大的困擾包券,畫面也就越卡。 一般平均來說炫贤,I的壓縮率是7(跟JPG差不多)溅固,P是20,B可以達到50兰珍,可見使用B幀能節(jié)省大量空間侍郭,節(jié)省出來的空間可以用來保存多一些I幀,這樣在相同碼率下掠河,可以提供更好的畫質(zhì)亮元。

上面這段話參考自CSDN Rachel-Zhang博主的一篇文章.

H.264壓縮算法中IPB幀

音頻編碼數(shù)據(jù)(AAC,MP3唠摹,AC-3)

音頻編碼數(shù)據(jù)
AAC格式簡介
  • 一般音頻編碼的重要性遠不如視頻編碼重要,因為音頻數(shù)據(jù)就算不壓縮,他的體積我們也是可以接受的.音頻壓縮中最常用的AAC原始碼流他是由一個一個的ADTS frame組成的,每個ADTS的大小還不是固定的.其中每個ADTS frame之間通過syncword(同步字)進行分隔爆捞。同步字為0xFFF(二進制“111111111111”)。AAC碼流解析的步驟就是首先從碼流中搜索0x0FFF勾拉,分離出ADTS frame煮甥;然后再分析ADTS frame的首部各個字段。這就是AAC碼流解碼時的主要邏輯.

視頻像素數(shù)據(jù)(YUV420P藕赞,RGB)

視頻像素數(shù)據(jù)
RGB格式簡介
YUV格式簡介
  • 我們生活中比較常見的像素數(shù)據(jù)主要有兩種,RGB個式和YUV格式,其中以后者的YUV420P居多.RGB格式的原理很簡單,使用RGB我們可以把一幅圖片的每個點上的顏色記錄下來,同時生活中所有的顏色都是由三原色組成的,差別為非就是三者的比例不同罷了.YUV的原理主要就是人眼對亮度敏感而對色度并不敏感,所以對色度進行了比較深的壓縮,可以看出對U和V分別壓縮到了Y的四分之一,也就是寬壓縮二分之一而長壓縮二分之一,YUV先從左上角到右下角一行行存儲了圖片的Y信息,再然后是U信息,最后才是V信息,我們播放YUV視頻時一般是無法直接播放的,因為他沒有文件頭所以我們要對視頻的一些基本信息(例如畫面寬高)進行設(shè)置才可以播放.

音頻采樣數(shù)據(jù)(PCM)

音頻采樣數(shù)據(jù)
PCM格式簡介
  • 學(xué)習(xí)PCM前我們需要了解什么是采樣,這個在大學(xué)教材數(shù)字信號處理有講

聲波其實是一個連續(xù)的模擬信號,我們?nèi)绻朐谟嬎銠C中對他進行處理,那么必須要將他轉(zhuǎn)換為數(shù)字信號,我們對這個連續(xù)的模擬信號(類似正弦波)進行每隔一定的時間就進行取點,獲取到該點的縱坐標(biāo)值,然后將這些點用平滑的曲線連接起來,就能完成模擬信號轉(zhuǎn)數(shù)字信號,當(dāng)然我們還要對其中的噪聲等因素進行處理,這些都是后話,這個采樣的時間間隔越短我們所轉(zhuǎn)化的數(shù)字信號的還原程度就越高.采樣率我們一般根據(jù)人耳的識別頻率以及奈奎斯特定理設(shè)為44.1kHZ,PCM格式也是不包含文件頭的,所以我們直接播放時要將它的采樣率和采樣精度設(shè)置好,否則就會出問題.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末成肘,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子斧蜕,更是在濱河造成了極大的恐慌双霍,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異洒闸,居然都是意外死亡染坯,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進店門丘逸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來酒请,“玉大人,你說我怎么就攤上這事鸣个⌒叻矗” “怎么了?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵囤萤,是天一觀的道長昼窗。 經(jīng)常有香客問我,道長涛舍,這世上最難降的妖魔是什么澄惊? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮富雅,結(jié)果婚禮上掸驱,老公的妹妹穿的比我還像新娘。我一直安慰自己没佑,他們只是感情好毕贼,可當(dāng)我...
    茶點故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蛤奢,像睡著了一般鬼癣。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上啤贩,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天待秃,我揣著相機與錄音,去河邊找鬼痹屹。 笑死章郁,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的志衍。 我是一名探鬼主播暖庄,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼足画!你這毒婦竟也來了雄驹?” 一聲冷哼從身側(cè)響起佃牛,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤淹辞,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體象缀,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡蔬将,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了央星。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片霞怀。...
    茶點故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖莉给,靈堂內(nèi)的尸體忽然破棺而出毙石,到底是詐尸還是另有隱情,我是刑警寧澤颓遏,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布徐矩,位于F島的核電站,受9級特大地震影響叁幢,放射性物質(zhì)發(fā)生泄漏滤灯。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一曼玩、第九天 我趴在偏房一處隱蔽的房頂上張望鳞骤。 院中可真熱鬧,春花似錦黍判、人聲如沸豫尽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拂募。三九已至,卻和暖如春窟她,著一層夾襖步出監(jiān)牢的瞬間陈症,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工震糖, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留录肯,地道東北人。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓吊说,卻偏偏與公主長得像论咏,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子颁井,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,440評論 2 348

推薦閱讀更多精彩內(nèi)容