ffmpeg播放器開發(fā) 詳細(xì)記錄+代碼實現(xiàn)4

請接上一個簡書內(nèi)容觀看,會對上一章的代碼進(jìn)行改進(jìn)和修改~~~

ffmpeg播放器4-音視頻同步

1.ffmpeg 音視頻同步的開發(fā)

AudioChannel中:getPcm()方法中 獲取到音頻播放的相對時間

//獲得 frame 的一個相對播放時間 (相對開始播放的時間)
    // 獲取相對播放這一段數(shù)據(jù)的秒數(shù)
    clock = frame->pts * av_q2d(time_base);

VideoChannel.cpp中 play()中 callback之前 獲取當(dāng)前畫面的播放時間宿接,并與音頻中的播放時間進(jìn)行對比:

        // 獲得 當(dāng)前這一個畫面 播放的相對時間
        double clock = frame->best_effort_timestamp * av_q2d(time_base);
        // 計算額外的延遲時間
        double extra_delay = frame->repeat_pict / (2*fps);
        // 真實需要的間隔時間
        frame_delays += extra_delay;
        if (!audioChannel || clock == 0) {
            // 休眠  微秒  -> #include <libavutil/time.h>  防止卡頓
            av_usleep(frame_delays * 1000 * 1000);
        } else {
            // 用來比較音視頻
            double audioClock = audioChannel->clock;
            // 音視頻相差的間隔
            double diff = clock - audioClock;
            if (diff > 0) {
                // 視頻比較快 讓視頻休眠時間長一些
                av_usleep((frame_delays + diff) * 1000 * 1000);
            } else if (diff < 0) {
                // 音頻比較快
                if(fabs(diff) >= 0.05){
                    // 丟包  packet
//                    packets.sync();

                    // 丟包  frame
                    frames.sync();
                    continue;
                }else{
                   // 不睡眠 趕上音頻播放進(jìn)度
                }
            } else {
                av_usleep(frame_delays * 1000 * 1000);
            }
        }

2.相關(guān)知識整理

簡書鏈接:

音視頻同步方式:

1赘淮、將視頻根據(jù)音頻同步(以音頻為主)
2、以視頻為主
3睦霎、以一個外部時間進(jìn)度為主

幀率:單位時間內(nèi) 需要顯示多少個圖像 25fp:1s內(nèi)顯示25個圖像

//音頻
 //獲得 frame 的一個相對播放時間 (相對開始播放的時間)
    // 獲取相對播放這一段數(shù)據(jù)的秒數(shù)
    clock = frame->pts * av_q2d(time_base);
//視頻
  // 獲得 當(dāng)前這一個畫面 播放的相對時間
        double clock = frame->best_effort_timestamp * av_q2d(time_base);

I frame :幀內(nèi)編碼幀 梢卸,I 幀通常是每個 GOP(MPEG 所使用的一種視頻壓縮技術(shù))的第一個幀,經(jīng)過適度地壓縮副女,做為隨機(jī)訪問的參考點蛤高,可以當(dāng)成圖象。I幀可以看成是一個圖像經(jīng)過壓縮后的產(chǎn)物碑幅。

P frame: 前向預(yù)測編碼幀戴陡,通過充分將低于圖像序列中前面已編碼幀的時間冗余信息來壓縮傳輸數(shù)據(jù)量的編碼圖像,也叫預(yù)測幀沟涨;

B frame: 雙向預(yù)測內(nèi)插編碼幀 猜欺,既考慮與源圖像序列前面已編碼幀,也顧及源圖像序列后面已編碼幀之間的時間冗余信息來壓縮傳輸數(shù)據(jù)量的編碼圖像拷窜,也叫雙向預(yù)測幀;

I frame:自身可以通過視頻解壓算法解壓成一張單獨的完整的圖片。

P frame:需要參考其前面的一個I frame 或者B frame來生成一張完整的圖片篮昧。

B frame:則要參考其前一個I或者P幀及其后面的一個P幀來生成一張完整的圖片赋荆。

PTS:Presentation Time Stamp。PTS主要用于度量解碼后的音視頻幀什么時候被顯示出來

DTS:Decode Time Stamp懊昨。DTS主要是標(biāo)識讀入內(nèi)存中的幀數(shù)據(jù)在什么時候開始送入解碼器中進(jìn)行解碼窄潭。

在沒有B幀存在的情況下DTS的順序和PTS的順序應(yīng)該是一樣的。

DTS主要用于視頻的解碼,在解碼階段使用酵颁。PTS主要用于視頻的同步和輸出.在顯示的時候使用嫉你。

dts與pts.jpg

如上圖:I frame 的解碼不依賴于任何的其它的幀.而p frame的解碼則依賴于其前面的I frame或者P frame.B frame的解碼則依賴于其前的最近的一個I frame或者P frame 及其后的最近的一個P frame.

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市躏惋,隨后出現(xiàn)的幾起案子幽污,更是在濱河造成了極大的恐慌,老刑警劉巖簿姨,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件距误,死亡現(xiàn)場離奇詭異,居然都是意外死亡扁位,警方通過查閱死者的電腦和手機(jī)准潭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來域仇,“玉大人刑然,你說我怎么就攤上這事∠疚瘢” “怎么了泼掠?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長般卑。 經(jīng)常有香客問我武鲁,道長,這世上最難降的妖魔是什么蝠检? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任沐鼠,我火速辦了婚禮,結(jié)果婚禮上叹谁,老公的妹妹穿的比我還像新娘饲梭。我一直安慰自己,他們只是感情好焰檩,可當(dāng)我...
    茶點故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布憔涉。 她就那樣靜靜地躺著,像睡著了一般析苫。 火紅的嫁衣襯著肌膚如雪兜叨。 梳的紋絲不亂的頭發(fā)上穿扳,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天,我揣著相機(jī)與錄音国旷,去河邊找鬼矛物。 笑死,一個胖子當(dāng)著我的面吹牛跪但,可吹牛的內(nèi)容都是我干的履羞。 我是一名探鬼主播,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼屡久,長吁一口氣:“原來是場噩夢啊……” “哼忆首!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起被环,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤糙及,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后蛤售,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體丁鹉,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年悴能,在試婚紗的時候發(fā)現(xiàn)自己被綠了揣钦。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡漠酿,死狀恐怖冯凹,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情炒嘲,我是刑警寧澤宇姚,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站夫凸,受9級特大地震影響浑劳,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜夭拌,卻給世界環(huán)境...
    茶點故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一魔熏、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧鸽扁,春花似錦蒜绽、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至骡和,卻和暖如春相赁,著一層夾襖步出監(jiān)牢的瞬間相寇,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工噪生, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留裆赵,地道東北人。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓跺嗽,卻偏偏與公主長得像,于是被迫代替她去往敵國和親页藻。 傳聞我的和親對象是個殘疾皇子桨嫁,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,864評論 2 354

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

  • 教程一:視頻截圖(Tutorial 01: Making Screencaps) 首先我們需要了解視頻文件的一些基...
    90后的思維閱讀 4,697評論 0 3
  • FFmpeg 介紹 FFmpeg是一套可以用來記錄、轉(zhuǎn)換數(shù)字音頻份帐、視頻璃吧,并能將其轉(zhuǎn)化為流的開源計算機(jī)程序。采用LG...
    Y了個J閱讀 11,284評論 0 28
  • ### YUV顏色空間 視頻是由一幀一幀的數(shù)據(jù)連接而成废境,而一幀視頻數(shù)據(jù)其實就是一張圖片畜挨。 yuv是一種圖片儲存格式...
    天使君閱讀 3,286評論 0 4
  • 最近項目中需要實現(xiàn)一個類似于硬幣翻轉(zhuǎn)的雙面View,由于太懶了就在github上找了一個。CMSCoinView ...
    Raaaaamsey閱讀 672評論 0 0
  • 年初六噩凹,人們習(xí)慣用六六大順來討口彩巴元,其實順不順如人飲水、冷暖自知驮宴,心情好一切都好逮刨,情緒順一切皆順,就是真遇到一點不...
    愛莎AS閱讀 307評論 2 1