播放器開發(fā)系列音視頻同步下_第1頁
播放器開發(fā)系列音視頻同步下_第2頁
播放器開發(fā)系列音視頻同步下_第3頁
播放器開發(fā)系列音視頻同步下_第4頁
播放器開發(fā)系列音視頻同步下_第5頁
已閱讀5頁,還剩9頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、本課講師:Darren老師10-播放器開發(fā)系列(5)音視頻同步(下)課程主講Darren老師:2167195649講師介紹 動腦學(xué)院 -Darren老師 (廖慶富)高級資深工程師 音視頻開發(fā),嵌入式系統(tǒng)開發(fā),圖像處理以及服務(wù)器開發(fā)等方面有豐富的研發(fā)與實(shí)戰(zhàn)經(jīng)驗(yàn)。 曾供職于珠海揚(yáng)智,深圳聯(lián)發(fā)科等知名半導(dǎo)體公司。 課程提綱各個serial之間的關(guān)系compute_target_delay的本質(zhì)解碼過程關(guān)鍵點(diǎn)frame_timer的本質(zhì)decoder_decode_frame 解碼注意點(diǎn)(1)結(jié)束流的情況,發(fā)送NULL到avcodec_send_packet(),促使調(diào)用者可以通過avcodec_re

2、ceive_frame讀取剩余解碼器內(nèi)部的所有幀;(2)在再次解碼之前,必須使用avcodec_flush_buffers()重新編碼;(3) avcodec_receive_frame返回EAGAIN則需要avcodec_send_packet繼續(xù)發(fā)送數(shù)據(jù)包到解碼器;(4) avcodec_send_packet返回EAGAIN則需要,則需要調(diào)用avcodec_receive_frame讀取解碼后的幀,再重新發(fā)送該packet;原始圖像 I B P編碼后圖像 I P B解碼的過程圖像 I P B, avcodec_receive_frame讀到幀順序 I B Pdecoder_decode_

3、frame - 什么時候flush解碼器?正常播放,音視頻數(shù)據(jù)包已經(jīng)讀取完畢起源: packet_queue_put_nullpacket(is-videoq, is-video_stream);(在read_thread函數(shù))結(jié)果:avcodec_flush_buffers (在decoder_decode_frame函數(shù))Seek播放(快進(jìn)快退拖動等)起源:packet_queue_put(&is-audioq, &flush_pkt); (在read_thread函數(shù))結(jié)果:avcodec_flush_buffers (在decoder_decode_frame函數(shù))開始播放起源:pac

4、ket_queue_start(在read_thread函數(shù))結(jié)果:avcodec_flush_buffers (在decoder_decode_frame函數(shù))decoder_decode_frame 之a(chǎn)vcodec_send_packet的EAGAIN問題typedef struct Decoder / 保存需要EAGAIN的packet AVPacket pkt; / =1說明pkt需要重新發(fā)送給解碼器,=0則不需要 intpacket_pending; Decoder; 具體見 decoder_decode_frame 函數(shù)flush_pkt初始化 (重點(diǎn)強(qiáng)調(diào))/ 初始化flush_

5、packetav_init_packet(&flush_pkt);/ 初始化為數(shù)據(jù)指向自己本身flush_pkt.data = (uint8_t *)&flush_pkt; 起源于:main函數(shù)進(jìn)行初始化使用于:decoder_decode_frameSerial之間的關(guān)系MyAVPacketList / 數(shù)據(jù)包 int serial;PacketQueue / 數(shù)據(jù)包隊(duì)列 intserial; Clock / 時鐘 intserial; / 實(shí)際指向PacketQueue-serial int*queue_serial; Frame / 數(shù)據(jù)幀 int serial; Decoder int

6、 pkt_serial; VideoState / 播放器 int audio_clock_serial;正常播放過程中各個結(jié)構(gòu)體的serial是相同的,在seek相關(guān)操作中才會切換serial,當(dāng)檢測到serial不同時,則需要做異常處理。Serial之間的關(guān)系packet_queue_put_nullpacketcompute_target_delay的本質(zhì)當(dāng)視頻超前比較多的時候,返回的delay就大一些,以便視頻播放慢一點(diǎn)當(dāng)視頻落后比較多的時候,則返回的delay小一些,甚至返回delay=0,以便視頻放快一些落后: speed, 則返回delay = 0假如落后超過一幀超前: diff

7、 = sync_threshold/is-speed & delay AV_SYNC_FRAMEDUP_THRESHOLD/is-speed ,則返回當(dāng)前 delay + diff超前: diff = sync_threshold /is-speed,則返回2 * delay如果在 -sync_threshold /is-speed diff speed內(nèi),則正常返回delay(幀間隔)。這里大家在看is-speed的時候先姑且認(rèn)為是1.0,即是常速播放可以將其省略去分析。frame_timer問題frame_timer主要用于控制video刷新:(1) frame_timer 初始值為0(2)第一幀先更新frame_timer,后續(xù)的幀以此為基準(zhǔn)按幀間隔播放;(3)當(dāng)出現(xiàn)seek相關(guān)的操作(快進(jìn)快退拖動等)時重新初始化frame_timer;(4)暫?;謴?fù)時需要

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論