FFMPEG音视频解码
1.播放多媒體文件步驟
通常情況下,我們下載的視頻文件如MP4,MKV、FLV等都屬于封裝格式,就是把音視頻數據按照相應的規范,打包成一個文本文件。我們可以使用MediaInfo這個工具查看媒體文件的相關信息。
所以當我們播放一個媒體文件時,通常需要經過以下幾個步驟
①解封裝(Demuxing):就是將輸入的封裝格式的數據,分離成為音頻流壓縮編碼數據和視頻流壓縮編碼數據。封裝格式種類很多,例如MP4,MKV,RMVB,TS,FLV,AVI等等,它的作用就是將已經壓縮編碼的視頻數據和音頻數據按照一定的格式放到一起。例如,FLV格式的數據,經過解封裝操作后,輸出H.264編碼的視頻碼流和AAC編碼的音頻碼流。
②解碼(Decode):就是將視頻/音頻壓縮編碼數據,解碼成為非壓縮的視頻/音頻原始數據。音頻的壓縮編碼標準包含AAC,MP3等,視頻的壓縮編碼標準則包含H.264,MPEG2等。解碼是整個系統中最重要也是最復雜的一個環節。通過解碼,壓縮編碼的視頻數據輸出成為非壓縮的顏色數據,例如YUV、RGB等等;壓縮編碼的音頻數據輸出成為非壓縮的音頻抽樣數據,例如PCM數據。
③音視頻同步:就是根據解封裝模塊處理過程中獲取到的參數信息,同步解碼出來的音頻和視頻數據,并將音視頻頻數據送至系統的顯卡和聲卡播放出來(Render)。
2.FFMPEG音視頻解碼
通過上面對媒體文件播放步驟的了解,我們在解碼多媒體文件的時候需要經過兩個步驟,即解封裝(Demuxing)和解碼(Decode)。下面就來看一下FFMPEG解碼媒體文件的時候是怎樣做這兩個步驟的。
FFmpeg解碼函數簡介:
? av_register_all():注冊所有組件。
? avformat_open_input():打開輸入視頻文件。
? avformat_find_stream_info():獲取視頻文件信息。
? avcodec_find_decoder():查找解碼器。
? avcodec_open2():打開解碼器。
? av_read_frame():從輸入文件讀取一幀壓縮數據。
? avcodec_decode_video2():解碼一幀壓縮數據。
? avcodec_close():關閉解碼器。
? avformat_close_input():關閉輸入視頻文件。
注:AVStream[0]一般為視頻流,AVStream[0]一般為音頻流
3.FFmpeg中的數據結構
AVFormatContext?封裝格式上下文結構體,也是統領全局的結構體,保存了視頻文件封裝 格式相關信息。
- iformat:輸入視頻的AVInputFormat
- nb_streams :輸入視頻的AVStream 個數
- streams :輸入視頻的AVStream []數組
- duration :輸入視頻的時長(以微秒為單位)
- bit_rate :輸入視頻的碼率
AVInputFormat?每種封裝格式(例如FLV, MKV, MP4, AVI)對應一個該結構體。
- name:封裝格式名稱
- long_name:封裝格式的長名稱
- extensions:封裝格式的擴展名
- id:封裝格式ID
- 一些封裝格式處理的接口函數
- FFmpeg數據結構分析
AVStream?視頻文件中每個視頻(音頻)流對應一個該結構體。
- id:序號
- codec:該流對應的AVCodecContext
- time_base:該流的時基
- r_frame_rate:該流的幀率
AVCodecContext編碼器上下文結構體,保存了視頻(音頻)編解碼相關信息。
- codec:編解碼器的AVCodec
- width, height:圖像的寬高(只針對視頻)
- pix_fmt:像素格式(只針對視頻)
- sample_rate:采樣率(只針對音頻)
- channels:聲道數(只針對音頻)
- sample_fmt:采樣格式(只針對音頻)
AVCodec?每種視頻(音頻)編解碼器(例如H.264解碼器)對應一個該結構體。
- name:編解碼器名稱
- long_name:編解碼器長名稱
- type:編解碼器類型
- id:編解碼器ID
- 一些編解碼的接口函數
AVPacket?存儲一幀壓縮編碼數據。
- pts:顯示時間戳
- dts :解碼時間戳
- data :壓縮編碼數據
- size :壓縮編碼數據大小
- stream_index :所屬的AVStream
AVFrame存儲一幀解碼后像素(采樣)數據。
- data:解碼后的圖像像素數據(音頻采樣數據)。
- linesize:對視頻來說是圖像中一行像素的大小;對音頻來說是音頻幀的大小。
- width, height:圖像的寬高(只針對視頻)。
- key_frame:是否為關鍵幀(只針對視頻) 。
- pict_type:幀類型(只針對視頻) 。例如I,P,B。
總結
以上是生活随笔為你收集整理的FFMPEG音视频解码的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: FFmpeg基本组成
- 下一篇: 最简单的基于FFMPEG+SDL的视频播