網(wǎng)站開發(fā)用什么系統(tǒng)比較好seo是做什么工作內(nèi)容
音視頻同步更多文章
深入理解音視頻pts,dts,time_base以及時(shí)間數(shù)學(xué)公式_視頻pts計(jì)算-CSDN博客
ffplay音視頻同步分析_ffplay 音視頻同步-CSDN博客
音視頻采集打時(shí)間戳設(shè)計(jì)
實(shí)時(shí)音視頻數(shù)據(jù)的采集和處理場(chǎng)景。具體來說:
采集階段:
- 在音視頻數(shù)據(jù)采集過程中,需要為每一幀數(shù)據(jù)計(jì)算出時(shí)間戳。
- 可以采用"起始時(shí)間=系統(tǒng)時(shí)間"的方式,計(jì)算第一幀的時(shí)間戳,后續(xù)幀按照固定的幀間隔累加得到。
- 同時(shí)引入動(dòng)態(tài)校正機(jī)制,檢測(cè)累計(jì)時(shí)間戳與系統(tǒng)時(shí)間的偏差,及時(shí)修正時(shí)間戳。
傳輸階段:
- 將計(jì)算好的時(shí)間戳與音視頻數(shù)據(jù)一起傳輸?shù)娇蛻舳恕?/li>
播放階段:
- 客戶端接收到數(shù)據(jù)后,先將其緩存一段時(shí)間。
- 然后根據(jù)附帶的時(shí)間戳信息,按照正確的時(shí)間順序進(jìn)行播放。
- 客戶端可以進(jìn)一步利用時(shí)間戳信息來調(diào)整緩沖區(qū),以適應(yīng)網(wǎng)絡(luò)環(huán)境的變化。
這種時(shí)間戳設(shè)計(jì)方案的核心思路就是:
- 在采集端盡量保證時(shí)間戳的準(zhǔn)確性和穩(wěn)定性。后續(xù)講解如何設(shè)計(jì)穩(wěn)定和準(zhǔn)確的方案
- 將時(shí)間戳信息傳輸?shù)娇蛻舳?利用它來進(jìn)行緩沖和時(shí)間校正。
- 通過客戶端和服務(wù)器端的協(xié)作,最終實(shí)現(xiàn)音視頻數(shù)據(jù)的平滑播放。
????????這是實(shí)時(shí)音視頻領(lǐng)域常用的一種時(shí)間戳管理策略,能夠很好地應(yīng)對(duì)系統(tǒng)負(fù)載變化、小數(shù)誤差累積等問題。
方案推導(dǎo)
第一方案?直接系統(tǒng)時(shí)間模式
初始化 starttime = systime
frameTimeStamp = systime - start time
缺陷:涉及到音頻硬件采樣不穩(wěn)定,操作系統(tǒng)調(diào)度和網(wǎng)絡(luò)傳輸?shù)臅r(shí)間,導(dǎo)致ts準(zhǔn)確度不夠問題且沒用糾正機(jī)制。
第二種方案?幀間隔模式
初始化 starttime = systime
frameTimeStamp = current systime - start time
Compute TimeStamp = last FrameTimeStamp + duration
優(yōu)點(diǎn):能輸出frame duration穩(wěn)定的音視頻時(shí)間戳。
缺陷:
- 系統(tǒng)負(fù)載過高時(shí),實(shí)際幀采集間隔可能與理論設(shè)定不一致。這將導(dǎo)致計(jì)算出的時(shí)間戳與實(shí)際情況不符,影響播放效果。
- 幀間隔涉及到無限小數(shù)時(shí),會(huì)隨時(shí)間累積產(chǎn)生較大的誤差。例如預(yù)計(jì)30幀,通常按幀間隔33毫秒處理,但實(shí)際是33.3333333毫秒。累積3333幀(約111秒)就出現(xiàn)1秒的誤差。
第三種方案? 幀間隔+直接系統(tǒng)時(shí)間模式
初始化 starttime = systime? ? ? ? ? ? ? ? ????????????????????????????????????????//起始時(shí)間=系統(tǒng)時(shí)間
frameTimeStamp = current systime - start time? ? ? ?????????????????//第一幀時(shí)間戳= 系統(tǒng)時(shí)間–起始時(shí)間
Compute TimeStamp = last FrameTimeStamp + duration? ? ? ?//后續(xù)幀TimeStamp=上一幀時(shí)間戳+ 幀間隔
?T = current systime? -? starttime? ? ?//當(dāng)前系統(tǒng)時(shí)間 – 起始時(shí)間?
if( |Compute TimeStamp - T | ?>= duraiton/2 ) ?Compute TimeStamp? = last FrameTimeStamp
//如果當(dāng)前幀的計(jì)算時(shí)間戳(CurrentFrameTS)與系統(tǒng)時(shí)間差值(T)的絕對(duì)值大于等于一個(gè)半幀間隔,那么我們就應(yīng)該將當(dāng)前幀的時(shí)間戳直接設(shè)置為系統(tǒng)時(shí)間差值T。?
解決:動(dòng)態(tài)糾正,在第二方案基礎(chǔ)上,解決了隨著播放幀數(shù),時(shí)間戳落后或提前現(xiàn)象。落點(diǎn)值 =??T = current systime? -? starttime? ? ?//當(dāng)前系統(tǒng)時(shí)間 – 起始時(shí)間。關(guān)鍵點(diǎn)是設(shè)置一個(gè)合理的校正閾值,這里我們使用了半幀間隔。
優(yōu)點(diǎn):能夠?qū)崟r(shí)糾正時(shí)間戳,只要系統(tǒng)正常運(yùn)轉(zhuǎn),就能立即恢復(fù)正確的時(shí)間戳。
缺陷:幀間隔不均勻,能否正常播放依賴于終端解決方案。 比如,假如音頻一幀間隔為24毫秒,被采集的回調(diào)時(shí)間可能為20 毫秒,28毫秒,27毫秒,21毫秒。
終端解決這個(gè)問題,可以從以下幾個(gè)方面著手:
在客戶端使用自適應(yīng)緩沖機(jī)制:
- 根據(jù)實(shí)際采集幀率的波動(dòng)情況,動(dòng)態(tài)調(diào)整緩沖區(qū)大小,盡量平滑播放。
在服務(wù)器端進(jìn)行幀率轉(zhuǎn)換:
- 服務(wù)器可以對(duì)不同幀率的數(shù)據(jù)進(jìn)行幀率轉(zhuǎn)換,輸出穩(wěn)定的幀率。
- 這樣可以屏蔽掉客戶端設(shè)備性能的影響。
使用更加先進(jìn)的時(shí)間戳校正算法:
- 例如利用機(jī)器學(xué)習(xí)等方法,預(yù)測(cè)并修正時(shí)間戳的偏差。
?
采集時(shí)間戳同步問題分析
在使用幀間隔+直接系統(tǒng)模式基礎(chǔ)上,發(fā)送端時(shí)間戳記錄:
- 記錄每一幀音視頻數(shù)據(jù)的pts時(shí)間戳和pts_duration幀間隔
- 同時(shí)記錄相鄰幀之間的系統(tǒng)時(shí)間間隔 sys_duration
- 這樣可以分析在采集階段,幀間隔的穩(wěn)定性
分析發(fā)送端時(shí)間戳:
- (1) ptsd(pts_duration)波動(dòng)大,說明采集幀間隔不穩(wěn)定,可能是由于系統(tǒng)負(fù)載波動(dòng)等因素引起的
- ???????幀間隔 pts_duration 波動(dòng)很大,那么意味著每幀數(shù)據(jù)被實(shí)際采集的時(shí)間間隔是不穩(wěn)定的。這通常是由于系統(tǒng)負(fù)載波動(dòng)、硬件性能波動(dòng)等因素引起的,導(dǎo)致采集過程不夠穩(wěn)定。
- (2) pts穩(wěn)定,但sysd(sys_duration)波動(dòng)大,說明在數(shù)據(jù)發(fā)送過程中,速率不夠穩(wěn)定可能是網(wǎng)絡(luò)傳輸過程中出現(xiàn)了抖動(dòng).
- ???????這里的 pts 時(shí)間戳是相對(duì)穩(wěn)定的,意味著數(shù)據(jù)在采集端生成時(shí)間戳是比較準(zhǔn)確的。但是,相鄰幀之間的系統(tǒng)時(shí)間間隔 sys_duration 卻出現(xiàn)了波動(dòng),說明在數(shù)據(jù)發(fā)送過程中,速率不夠穩(wěn)定。這種情況通常是由于網(wǎng)絡(luò)傳輸過程中出現(xiàn)了抖動(dòng),導(dǎo)致實(shí)際發(fā)送速率不夠平滑。
- (3) sysd和ptsd的值應(yīng)該較為一致,如果兩者差異較大,說明在整個(gè)采集-傳輸過程中存在問題
- ???????比如: [send]audio:1-pts:20ms-ptsd:24ms; sysd=23ms
接收端時(shí)間戳記錄:
- 接收到的幀信息包含: 幀序號(hào)、pts時(shí)間戳、pts_duration幀間隔
- 同樣記錄了相鄰幀的系統(tǒng)時(shí)間間隔 sys_duration
分析接收端時(shí)間戳:
- (1) ptsd(pts_duration)波動(dòng)大,說明采集幀間隔不穩(wěn)定
- (2) pts穩(wěn)定,但sysd(sys_duration)波動(dòng)大。說明在數(shù)據(jù)發(fā)送過程中,速率不夠穩(wěn)定
- 比如: [recv] audio:1-pts:20ms-ptsd:24ms; sysd=23ms 200ms
總結(jié)核心思路是:
- 在發(fā)送端和接收端同時(shí)記錄時(shí)間戳信息,包括pts時(shí)間戳和系統(tǒng)時(shí)間
- 通過對(duì)這些時(shí)間戳數(shù)據(jù)的分析,可以全面診斷出音視頻同步過程中的各種問題
- ptsd異常 采集端的幀間隔不穩(wěn)定
- pts穩(wěn)定下 sysd異常 推流端的數(shù)據(jù)傳輸速率不穩(wěn)定,存在網(wǎng)絡(luò)傳輸過程中的抖動(dòng)。
?
?學(xué)習(xí)資料分享
0voice · GitHub