更多音視頻知識(shí)請(qǐng)點(diǎn)擊:專注音視頻開發(fā)
背景
開發(fā)環(huán)境搭建請(qǐng)參考FFMPEG入門系列01-QT+FFMPEG4.0 Windows開發(fā)環(huán)境搭建
本章內(nèi)容講解基于FFMPEG4.0.2 + SDL2.0
概述
媒體文件通常有一些基本的組成部分翎朱。你在學(xué)習(xí)源碼之前需要了解以下的概念:
- 容器(container)涣雕,文件本身被稱為容器闭翩,容器的的類型定義了文件的信息是如何存儲(chǔ)挣郭,比如,AVI兑障、FLV、MP4等容器格式蕉汪。當(dāng)我們從容器讀取媒體數(shù)據(jù)的時(shí)候稱為解復(fù)用器(demuxer),當(dāng)我們把媒體數(shù)據(jù)寫入容器的時(shí)候稱為復(fù)用器(muxer).
- 流(stream)者疤,每個(gè)音視頻媒體通常會(huì)有一路音頻流和一路視頻流福澡。這些流需要根據(jù)容器規(guī)定的格式存儲(chǔ)到媒體文件當(dāng)中。
- 幀(frame)驹马,流中的數(shù)據(jù)元素被稱為幀革砸,但對(duì)于FFMPEG而言,一般壓縮的數(shù)據(jù)成為數(shù)據(jù)包(packet)糯累,經(jīng)過解碼器解碼后的數(shù)據(jù)再成為幀(frame)算利。
- 編/解碼器(codec),每路流都會(huì)被相應(yīng)的「編/解碼器(codec)」進(jìn)行編碼或解碼泳姐。codec 定義了實(shí)際數(shù)據(jù)是如何被編解碼的效拭,比如你用到的MP4文件的音視頻流數(shù)據(jù)可能是 H264 和 MP3編碼器進(jìn)行編碼的。
- 數(shù)據(jù)包(packets),是從流中讀取的數(shù)據(jù)片段缎患,這些數(shù)據(jù)片段中包含的一個(gè)個(gè)比特經(jīng)過解碼后可以得到的圖像幀(畫面)或者PCM幀(聲音)慕的。通常情況下,每個(gè)數(shù)據(jù)包含完整的一幀多媒體(音頻/視頻/字幕等等)數(shù)據(jù)挤渔,但要注意在音頻情況下肮街,一個(gè)數(shù)據(jù)包中可能會(huì)包含多個(gè)音頻幀。
播放器框架圖
基于以上這些基礎(chǔ)蚂蕴,處理視頻流和音頻流的過程其實(shí)很簡單:
- 根據(jù)容器類型找到合適的解復(fù)用器(demuxer)低散;
對(duì)應(yīng)函數(shù):avformat_open_input - 使用解復(fù)用器(demuxer)讀取多媒體數(shù)據(jù)俯邓,分析媒體文件的信息骡楼,比如有幾路音頻流,幾路視頻流稽鞭,它們是什么樣的編碼格式鸟整。音頻幀的信息:包括采樣率、采樣格式朦蕴、通道數(shù)等篮条;視頻幀的信息:包括分辨率、圖像格式吩抓、幀率等等涉茧。對(duì)應(yīng)函數(shù):
- avformat_find_stream_info
- av_find_best_stream
- 查找碼流對(duì)應(yīng)的解碼器,如果能夠找到則打開相應(yīng)的解碼器疹娶,對(duì)應(yīng)函數(shù):
- avcodec_alloc_context3
- avcodec_parameters_to_context
- avcodec_find_decoder
- avcodec_open2
- 不斷地讀取音視頻數(shù)據(jù)包伴栓,對(duì)應(yīng)函數(shù):
- av_read_frame
- 將數(shù)據(jù)包送給解碼器雨饺,并讀取解碼后的數(shù)據(jù)幀钳垮,對(duì)應(yīng)函數(shù):
- avcodec_send_packet
- avcodec_receive_frame
- 將獲取的視頻幀進(jìn)行畫面顯示额港,音頻幀進(jìn)行聲音輸出饺窿。
- 不斷循環(huán) 4移斩,5肚医,6三個(gè)步驟向瓷,直到數(shù)據(jù)讀取完畢忍宋。
參考
MFC中如何利用ffmpeg和SDL2.0多線程多窗口播放攝像頭的視頻https://blog.csdn.net/marising/article/details/52145316?utm_source=blogxgwz5