音视频常见播放器框架分析
音視頻面試必問:如何設(shè)計(jì)一個播放器
1.常見播放器框架分析
2.如何解決播放端延遲的問題
3.音視頻如何做同步
4.快進(jìn)、快退、逐幀播放如何實(shí)現(xiàn)
音視頻開發(fā)技術(shù)精講《常見播放器框架分析》
播放器框架
SDL2播放音頻
使用SDL播放解碼后的音頻數(shù)據(jù),SDL播放音頻數(shù)據(jù)的流程
如下:
播放器-播放做了哪一些事情?
打開媒體文件
分析媒體流成分
查找相應(yīng)的解碼器
數(shù)據(jù)讀取線程-讀取數(shù)據(jù)包并放入包緩存隊(duì)列 av_read_frame
解碼線程-解碼數(shù)據(jù)包得到數(shù)據(jù)幀并放入幀緩存隊(duì)列
audio_ thread 音頻解碼線程
video_ thread視頻解碼
音頻回調(diào)接口-讀取音頻數(shù)據(jù)幀
sdl_audio_callback
視頻刷新線程-以音頻為基準(zhǔn)做同步顯示圖像
video_refresh
播放器-靜音和音量控制的本質(zhì)
音量控制的本質(zhì):控制采樣點(diǎn)的幅值
靜音,將采樣點(diǎn)數(shù)值置為0
音量+,提升采樣點(diǎn)的幅值
音量-,降低采樣點(diǎn)的幅值
播放器-靜音和音量控制的本質(zhì)
ffplay控制音量的方式
最大音量:輸出解碼后的原始數(shù)據(jù)
靜音:即是輸出數(shù)值為0的數(shù)據(jù) toggle_ mute( )
改變音量:通過SDL_ MixAudio改變解碼后數(shù)據(jù)的幅值update_ volume()
比如下圖所示(sdI audio_ callback函數(shù)內(nèi)) :
以下是ffplay的方式供參考
播放器-快進(jìn)快退
快進(jìn)和快退的本質(zhì)是seek到某個點(diǎn)重新開始播放。
- 跳轉(zhuǎn)到指定的數(shù)據(jù)位置avformat_ seek_ file
- 清空packet隊(duì)列
- 清空frame隊(duì)列(在ffplay里面是通過serial去控制)
- 清空解碼器
seek/快進(jìn)/快退: stream_ seek()/ avformat_ seek_ file()
seek播放流程
- 左右箭頭產(chǎn)生seek事件;
- 將文件seek到指定時間點(diǎn),清空packet隊(duì)列,刷新解碼器.
- 切換時鐘序列(ffplay)
注意:不同的容器(比如MP4和FLV) seek的機(jī)制是不一樣的。有些容器
seek的時間會快些,有些則相對耗時。這個和容器的存儲結(jié)構(gòu)有關(guān)系。
FFmpeg/WebRTC/RTMP/RTSP/HLS/RTP播放器-音視頻流媒體高級開發(fā) 學(xué)習(xí)資料、視頻教程
總結(jié)
以上是生活随笔為你收集整理的音视频常见播放器框架分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LoadRunner中进程运行和线程运行
- 下一篇: filter与servlet对照