當前位置:編程學習大全網 - 編程語言 - 附加: FFmpeg概念理解

附加: FFmpeg概念理解

FFmpeg 介紹

FFmpeg是壹套可以用來記錄、轉換數字音頻、視頻,並能將其轉化為流的開源計算機程序。采用LGPL或GPL許可證。它提供了錄制、轉換以及流化音視頻的完整解決方案。它包含了非常先進的音頻/視頻編解碼庫libavcodec,為了保證高可移植性和編解碼質量,libavcodec裏很多codec都是從頭開發的。

FFmpeg在Linux平臺下開發,但它同樣也可以在其它操作系統環境中編譯運行,包括Windows、Mac OS X等。這個項目最早由Fabrice Bellard發起,現在由Michael Niedermayer維護。許多FFmpeg的開發人員都來自MPlayer項目,而且當前FFmpeg也是放在MPlayer項目組的服務器上。項目的名稱來自MPEG視頻編碼標準,前面的"FF"代表"Fast Forward"。

FFmpeg模塊

libavformat:用於各種音視頻封裝格式的生成和解析,包括獲取解碼所需信息以生成解碼上下文結構和讀取音視頻幀等功能;

libavcodec:用於各種類型聲音/圖像編解碼;

libavutil:包含壹些公***的工具函數;

libswscale:用於視頻場景比例縮放、色彩映射轉換;

libpostproc:用於後期效果處理;

ffmpeg:該項目提供的壹個工具,可用於格式轉換、解碼或電視卡即時編碼等;

ffsever:壹個 HTTP 多媒體即時廣播串流服務器;

ffplay:是壹個簡單的播放器,使用ffmpeg 庫解析和解碼,通過SDL顯示;

H.264編碼原理I/B/P幀

三種幀的說明

I幀:幀內編碼幀 ,I幀表示關鍵幀,妳可以理解為這壹幀畫面的完整保留;解碼時只需要本幀數據就可以完成(因為包含完整畫面)

I幀特點:

1.它是壹個全幀壓縮編碼幀。它將全幀圖像信息進行JPEG壓縮編碼及傳輸;

2.解碼時僅用I幀的數據就可重構完整圖像;

3.I幀描述了圖像背景和運動主體的詳情;

4.I幀不需要參考其他畫面而生成;

5.I幀是P幀和B幀的參考幀(其質量直接影響到同組中以後各幀的質量);

6.I幀是幀組GOP的基礎幀(第壹幀),在壹組中只有壹個I幀;

7.I幀不需要考慮運動矢量;

8.I幀所占數據的信息量比較大。

P幀:前向預測編碼幀。P幀表示的是這壹幀跟之前的壹個關鍵幀(或P幀)的差別,解碼時需要用之前緩存的畫面疊加上本幀定義的差別,生成最終畫面。(也就是差別幀,P幀沒有完整畫面數據,只有與前壹幀的畫面差別的數據)

P幀的預測與重構:P幀是以I幀為參考幀,在I幀中找出P幀“某點”的預測值和運動矢量,取預測差值和運動矢量壹起傳送。在接收端根據運動矢量從I幀中找出P幀“某點”的預測值並與差值相加以得到P幀“某點”樣值,從而可得到完整的P幀。

P幀特點:

1.P幀是I幀後面相隔1~2幀的編碼幀;

2.P幀采用運動補償的方法傳送它與前面的I或P幀的差值及運動矢量(預測誤差);

3.解碼時必須將I幀中的預測值與預測誤差求和後才能重構完整的P幀圖像;

4.P幀屬於前向預測的幀間編碼。它只參考前面最靠近它的I幀或P幀;

5.P幀可以是其後面P幀的參考幀,也可以是其前後的B幀的參考幀;

6.由於P幀是參考幀,它可能造成解碼錯誤的擴散;

7.由於是差值傳送,P幀的壓縮比較高。

B幀:雙向預測內插編碼幀。B幀是雙向差別幀,也就是B幀記錄的是本幀與前後幀的差別(具體比較復雜,有4種情況,但我這樣說簡單些),換言之,要解碼B幀,不僅要取得之前的緩存畫面,還要解碼之後的畫面,通過前後畫面的與本幀數據的疊加取得最終的畫面。B幀壓縮率高,但是解碼時CPU會比較累。

B幀的預測與重構

B幀以前面的I或P幀和後面的P幀為參考幀,“找出”B幀“某點”的預測值和兩個運動矢量,並取預測差值和運動矢量傳送。接收端根據運動矢量在兩個參考幀中“找出(算出)”預測值並與差值求和,得到B幀“某點”樣值,從而可得到完整的B幀。

B幀特點

1.B幀是由前面的I或P幀和後面的P幀來進行預測的;

2.B幀傳送的是它與前面的I或P幀和後面的P幀之間的預測誤差及運動矢量;

3.B幀是雙向預測編碼幀;

4.B幀壓縮比最高,因為它只反映丙參考幀間運動主體的變化情況,預測比較準確;

5.B幀不是參考幀,不會造成解碼錯誤的擴散。

註:I、B、P各幀是根據壓縮算法的需要,是人為定義的,它們都是實實在在的物理幀。壹般來說,I幀的壓縮率是7(跟JPG差不多),P幀是20,B幀可以達到50。可見使用B幀能節省大量空間,節省出來的空間可以用來保存多壹些I幀,這樣在相同碼率下,可以提供更好的畫質。

h264的壓縮方法:

1.分組:把幾幀圖像分為壹組(GOP,也就是壹個序列),為防止運動變化,幀數不宜取多。

2.定義幀:將每組內各幀圖像定義為三種類型,即I幀、B幀和P幀;

3.預測幀:以I幀做為基礎幀,以I幀預測P幀,再由I幀和P幀預測B幀;

4.數據傳輸:最後將I幀數據與預測的差值信息進行存儲和傳輸。幀內(Intraframe)壓縮也稱為空間壓縮(Spatial compression)。當壓縮壹幀圖像時,僅考慮本幀的數據而不考慮相鄰幀之間的冗余信息,這實際上與靜態圖像壓縮類似。幀內壹般采用有損壓縮算法,由於幀內壓縮是編碼壹個完整的圖像,所以可以獨立的解碼、顯示。幀內壓縮壹般達不到很高的壓縮,跟編碼jpeg差不多。

幀間(Interframe)壓縮的原理是:相鄰幾幀的數據有很大的相關性,或者說前後兩幀信息變化很小的特點。也即連續的視頻其相鄰幀之間具有冗余信息,根據這壹特性,壓縮相鄰幀之間的冗余量就可以進壹步提高壓縮量,減小壓縮比。幀間壓縮也稱為時間壓縮(Temporal compression),它通過比較時間軸上不同幀之間的數據進行壓縮。幀間壓縮壹般是無損的。幀差值(Frame differencing)算法是壹種典型的時間壓縮法,它通過比較本幀與相鄰幀之間的差異,僅記錄本幀與其相鄰幀的差值,這樣可以大大減少數據量。

順便說下有損(Lossy )壓縮和無損(Lossy less)壓縮。無損壓縮也即壓縮前和解壓縮後的數據完全壹致。多數的無損壓縮都采用RLE行程編碼算法。有損壓縮意味著解壓縮後的數據與壓縮前的數據不壹致。在壓縮的過程中要丟失壹些人眼和人耳所不敏感的圖像或音頻信息,而且丟失的信息不可恢復。幾乎所有高壓縮的算法都采用有損壓縮,這樣才能達到低數據率的目標。丟失的數據率與壓縮比有關,壓縮比越小,丟失的數據越多,解壓縮後的效果壹般越差。此外,某些有損壓縮算法采用多次重復壓縮的方式,這樣還會引起額外的數據丟失。

H264 NAL頭解析

如果NALU對應的Slice為壹幀的開始,則用4字節表示,即0x00000001;否則用3字節表示,0x000001。

NAL Header:forbidden_bit,nal_reference_bit(優先級)2bit,nal_unit_type(類型)5bit。 標識NAL單元中的RBSP數據類型,其中,nal_unit_type為1, 2, 3, 4, 5的NAL單元稱為VCL的NAL單元,其他類型的NAL單元為非VCL的NAL單元。

0:未規定

1:非IDR圖像中不采用數據劃分的片段

2:非IDR圖像中A類數據劃分片段

3:非IDR圖像中B類數據劃分片段

4:非IDR圖像中C類數據劃分片段

5:IDR圖像的片段

6:補充增強信息(SEI)

7:序列參數集(SPS)

8:圖像參數集(PPS)

9:分割符

10:序列結束符

11:流結束符

12:填充數據

13:序列參數集擴展

14:帶前綴的NAL單元

15:子序列參數集

16 – 18:保留

19:不采用數據劃分的輔助編碼圖像片段

20:編碼片段擴展

21 – 23:保留

24 – 31:未規定

H.264的SPS和PPS串,包含了初始化H.264解碼器所需要的信息參數,包括編碼所用的profile,level,圖像的寬和高,deblock濾波器等。

碼率:256~512 kb/s

幀率:15~20fps

分辨率:1280x720(HD) 640x368(VGA) 1920x1080(UHD)

AAC(Advanced Audio Coding)

中文名:高級音頻編碼,出現於1997年,基於MPEG-2的音頻編碼技術。由Fraunhofer IIS、杜比實驗室、AT&T、Sony等公司***同開發,目的是取代MP3格式。2000年,MPEG-4標準出現後,AAC重新集成了其特性,加入了SBR技術和PS技術,為了區別於傳統的MPEG-2 AAC又稱為MPEG-4 AAC。

優點:相對於mp3,AAC格式的音質更佳,文件更小。

不足:AAC屬於有損壓縮的格式,與時下流行的APE、FLAC等無損格式相比音質存在“本質上”的差距。加之,傳輸速度更快的USB3.0和16G以上大容量MP3正在加速普及,也使得AAC頭上“小巧”的光環不復存在了。

音頻采樣率是指錄音設備在壹秒鐘內對聲音信號的采樣次數,采樣頻率越高聲音的還原就越真實越自然。在當今的主流采集卡上,采樣頻率壹般***分為22.05KHz、44.1KHz、48KHz三個等級,22.05KHz只能達到FM廣播的聲音品質,44.1KHz則是理論上的CD音質界限,48KHz則更加精確壹些。

比特率是指每秒傳送的比特(bit)數。單位為 bps(Bit Per Second),比特率越高,傳送數據速度越快。聲音中的比特率是指將模擬聲音信號轉換成數字聲音信號後,單位時間內的二進制數據量,是間接衡量音頻質量的壹個指標。 視頻中的比特率(碼率)原理與聲音中的相同,都是指由模擬信號轉換為數字信號後,單位時間內的二進制數據量。

信道編碼中,K符號大小的信源數據塊通過編碼映射為N符號大小的碼字,則K/N成為碼率,其中假設編碼前後的符號表沒有變化。

FFMPEG中結構體很多。最關鍵的結構體可以分成以下幾類:

解協議(piler flags —>cflags 加上OTHER_CFLAGS="-fembed-bitcode" 。

FFmpeg優化

1 內存優化。內存往上漲。沒能及時回收。最好能夠使用手動管理內存。

解碼優化,看ffmpeg文檔,最新的解碼庫,解碼效率,穩定性,綜合性考慮。

YUV->RGB? OpenGLES shader來顯示。

FFmpeg轉碼

1.分離視頻音頻流

ffmpeg -i input_file -vcodec copy -an output_file_video  //分離視頻流

ffmpeg -i input_file -acodec copy -vn output_file_audio  //分離音頻流

2.視頻解復用

ffmpeg –i test.mp4 –vcodec copy –an –f m4v test.264

ffmpeg –i test.avi –vcodec copy –an –f m4v test.264

3.視頻轉碼

ffmpeg –i test.mp4 –vcodec h264 –s 352 278 –an –f m4v test.264 ? //轉碼為碼流原始文件

ffmpeg –i test.mp4 –vcodec h264 –bf 0 –g 25 –s 352

278 –an –f m4v test.264? //轉碼為碼流原始文件

ffmpeg –i test.avi -vcodec mpeg4 –vtag xvid –qsame test_xvid.avi //轉碼為封裝文件

//-bf B幀數目控制,-g 關鍵幀間隔控制,-s 分辨率控制

4.視頻封裝

ffmpeg –i video_file –i audio_file –vcodec copy –acodec copy output_file

5.視頻剪切

ffmpeg –i test.avi –r 1 –f image2 image-%3d.jpeg //提取圖片

ffmpeg -ss 0:1:30 -t 0:0:20 -i input.avi -vcodec copy -acodec copy output.avi //剪切視頻

//-r 提取圖像的頻率,-ss 開始時間,-t 持續時間

6.視頻錄制

ffmpeg –i rtsp://192.168.3.205:5555/test –vcodec copy out.avi

7.YUV序列播放

ffplay -f rawvideo -video_size 1920x1080 input.yuv

8.YUV序列轉AVI

ffmpeg –s w*h –pix_fmt yuv420p –i input.yuv –vcodec mpeg4 output.avi

system調用

#include<stdio.h>#include<string.h>intmain(){charcommand[50];strcpy(command,"ffmpeg –s w*h –pix_fmt yuv420p –i input.yuv –vcodec mpeg4 output.avi");system(command);return(0);}

FFMpeg 中比較重要的函數以及數據結構如下:

數據結構:

(1) AVFormatContext

(2) AVOutputFormat

(3) AVInputFormat

(4) AVCodecContext

(5) AVCodec

(6) AVFrame

(7) AVPacket

(8) AVPicture

(9) AVStream

初始化函數:

(1) av_register_all()

(2) avcodec_open()

(3) avcodec_close()

(4) av_open_input_file()

(5) av_find_input_format()

(6) av_find_stream_info()

(7) av_close_input_file()

音視頻編解碼函數:

(1) avcodec_find_decoder()

(2) avcodec_alloc_frame()

(3) avpicture_get_size()

(4) avpicture_fill()

(5) img_convert()

(6) avcodec_alloc_context()

(7) avcodec_decode_video()

(8) av_free_packet()

(9) av_free()

文件操作:

(1) avnew_steam()

(2) av_read_frame()

(3) av_write_frame()

(4) dump_format()

其他函數:

(1) avpicture_deinterlace()

(2) ImgReSampleContext()

  • 上一篇:男生讀大專學什麽專業好就業?
  • 下一篇:南京北大青鳥分享Julia都有哪些優勢?
  • copyright 2024編程學習大全網