播放器技術(shù)分享(3):音畫同步

搞音視頻開發(fā)好些年,分享過許多博客文章,比如:前幾年發(fā)布的《FFmpeg Tips》系列,《Android 音頻開發(fā)》系列,《直播疑難雜癥排查》系列等等。最近想把多年來開發(fā)和優(yōu)化播放器的經(jīng)驗也分享出來,希望能幫助到音視頻領(lǐng)域的初學(xué)者。第一期文章要推出的內(nèi)容主要涉及到播放器比較核心的幾個技術(shù)點,大概的目錄如下:

目前成都創(chuàng)新互聯(lián)已為1000+的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)絡(luò)空間、網(wǎng)站改版維護、企業(yè)網(wǎng)站設(shè)計、東平網(wǎng)站維護等服務(wù),公司將堅持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。

1. 播放器技術(shù)分享(1):架構(gòu)設(shè)計

2. 播放器技術(shù)分享(2):緩沖區(qū)管理

3. 播放器技術(shù)分享(3):音畫同步

4. 播放器技術(shù)分享(4):首開時間

5. 播放器技術(shù)分享(5):延時優(yōu)化

本篇是系列文章的第三篇,主要聊一聊播放器的音畫同步。

1 概述

首先,我們給出音畫同步的定義:

音畫同步是指播放器正在渲染的每一幀畫面和正在播放的每一段聲音都是嚴格對應(yīng)起來的,不存在人耳和肉眼可以分辨出來的偏差。

2 時間戳

機器沒有眼睛也沒有耳朵,那它是如何去感知視頻文件中的某一幀視頻數(shù)據(jù)跟某一幀音頻數(shù)據(jù)是屬于 同一時間的呢 ?

現(xiàn)實生活中,判斷兩件事情是否同一時刻發(fā)生的方法就是記錄并且比較事件發(fā)生的日期時間,同樣,我們可以在音頻和視頻數(shù)據(jù)“生產(chǎn)”出來的時候,為數(shù)據(jù)標(biāo)記上一個“時間戳”,代表著它的出生時間。由此,播放器就知道如何判斷了。

播放器技術(shù)分享(3):音畫同步

如圖所示,音視頻在采集(生產(chǎn))的時候,就給每一幀都打上 “時間戳”(注意,音視頻的時間戳需要使用一個共同的時間戳基準(zhǔn)),假設(shè)以音頻開始采集時刻的系統(tǒng)絕對時間點作為時間戳 0 點,假設(shè)音頻 20ms 采樣一幀,視頻幀率 30fps -> 即 33ms 產(chǎn)生一幀,那么,視頻幀和音頻幀的時間戳大致的遞增規(guī)律為:

視頻幀:10,43,76,109,142,……

音頻幀:0,20,40,60,80,120,……

注:實際上數(shù)據(jù)采集不會這么 “均勻”,會有略微的浮動。

如此一來,播放器就可以通過附加在音頻和視頻幀上的時間戳信息,感知到音頻幀和視頻幀的 “相對關(guān)系”,實現(xiàn)音畫同步就輕而易舉了,判斷方法如下;

音畫同步的方法:判斷視頻與音頻幀的時間戳差值,是不是在一定的 “閾值” 范圍內(nèi),如果是,則可以渲染/播放,否則就 “等” 到合適的時間。

3 音畫同步的 “閾值”

由于音視頻是分開采集的,所以它們的時間戳不可能完全對應(yīng)得上,因此,只要在一個合理的 “閾值” 范圍內(nèi)即可認為是同步的。那么,這個 “閾值” 是怎么定義的呢 ?

播放器技術(shù)分享(3):音畫同步

如圖所示,這個 “閾值” 有一個國際標(biāo)準(zhǔn)定義了它,叫做:RFC-1359,它是這么定義的:

1. 無法察覺:音頻和視頻的時間戳差值在:-100ms ~ +25ms 之間

2. 能夠察覺:音頻滯后了 100ms 以上,或者超前了 25ms 以上

3. 無法接受:音頻滯后了 185ms 以上,或者超前了 90ms 以上

有了這個國際標(biāo)準(zhǔn)和經(jīng)驗值,我們做音畫同步取的閾值就不用瞎猜了~~

4 音畫同步的實現(xiàn)

音畫同步的實現(xiàn)策略一般有 3 種:

1. 視頻同步到音頻

2. 音頻同步到視頻

3. 音視頻同步到外部時鐘

比較常用的策略是:視頻同步到音頻。

因為音頻是流式的,按照規(guī)律的勻速的速率去播放,才能顯得更加 “平滑”,而視頻的播放其實是一張一張圖片進行刷新顯示,它的刷新時間的調(diào)整相對而言更容易一些,用戶肉眼的敏感度也更弱一些。

下面就講講使用 “視頻同步到音頻” 的方式,如何實現(xiàn)播放器的音畫同步:

播放器技術(shù)分享(3):音畫同步

如圖所示,A 代表音頻幀,P 代表視頻幀,音頻幀持續(xù)送入揚聲器以既定的速率播放,每播放一幀音頻數(shù)據(jù),則把該音頻幀的時間戳更新到 Master Clock,作為主時鐘,視頻幀則參考 Master Clock 來決定自己是否渲染、何時渲染或者丟棄,算法如下:

1. 假設(shè) min 為音畫同步閾值(如:25ms),則當(dāng)前視頻時間戳如果與 master clock 的絕對差值在 25ms 閾值范圍內(nèi)則都可以送入渲染

2. 如果 diff > 0,即 pts > m-clock,則代表視頻幀提前準(zhǔn)備好了。這種情況下,是可以通過 sleep 來等待主時鐘的,但是為了防止異常時間戳導(dǎo)致 sleep 時間過長,可以設(shè)置一個 max 異常閾值(如:1000ms),如果 diff 超過這個 max 可以認為是異常幀,丟棄掉

3. 如果 diff < 0,即 pts < m-clock,則代表視頻幀滯后了。這種情況下,如果滯后超出約定閾值(如:25ms)的視頻幀就應(yīng)該被丟棄

音畫同步最核心的思想就在這里了,看起來好像也并不是有多復(fù)雜,對吧~

6 總結(jié)

播放器的音畫同步,就分享到這里了,如有疑問的小伙伴歡迎來信 lujun.hust@gmail.com 交流。另外,也歡迎大家關(guān)注我的新浪微博 @盧_俊 或者 微信公眾號 @Jhuster 獲取最新的文章和資訊。

播放器技術(shù)分享(3):音畫同步

本文題目:播放器技術(shù)分享(3):音畫同步
URL地址:http://bm7419.com/article12/gegigc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供ChatGPT云服務(wù)器、軟件開發(fā)、標(biāo)簽優(yōu)化搜索引擎優(yōu)化、做網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

小程序開發(fā)