溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

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

發(fā)布時(shí)間:2020-07-11 03:00:12 來(lái)源:網(wǎng)絡(luò) 閱讀:3111 作者:Jhuster 欄目:軟件技術(shù)

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

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

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

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

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

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

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

1 概述

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

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

2 時(shí)間戳

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

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

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

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

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

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


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

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

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

3 音畫同步的 “閾值”

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

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

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

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

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

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

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

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

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

1. 視頻同步到音頻

2. 音頻同步到視頻

3. 音視頻同步到外部時(shí)鐘

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

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

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

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

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

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

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

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

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

6 總結(jié)

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

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


向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI