當前位置:首頁 » 操作系統 » ffmpeglinux

ffmpeglinux

發布時間: 2023-01-26 07:02:27

⑴ 如何安裝linux系統下的ffmpeg

linux下安裝ffmpeg1、下載ffmpeg。2、解壓tar xvfj ffmpeg-0.11.1.tar.bz2得到解壓後的目錄是ffmpeg-0.11.13、配置 ./configure --enable-shared --prefix=/usr/local/ffmpeg其中:--enable-shared 是允許其編譯產生動態庫,在以後的編程中要用到這個幾個動態庫。--prefix設置的安裝目錄。4、編譯並安裝makemake install5、安裝之後在/usr/local/ffmpeg會看到有四個目錄lib 動態鏈接庫位置include 編程要用到頭文件bin 執行文件所在的目錄 share6、為了以後方便編程,我們把lib中的三個鏈接庫libavcodec.so libavformat.so libavutil.so復制到/usr/lib下。把include目錄下的ffmpeg目錄復制到/usr/include下。執行bin目錄下的ffplay,可以去播放音頻或者視頻文件。例如播放1.mp3./ffplay 1.mp3 另外,bin目錄下還有兩個文件:ffmpeg和ffserverffmpeg是一個很好的視頻和音頻的格式轉化工具。網上有很多它的說明文檔。如果不想生成ffserver,只要在./configure的時候加--disable-ffserver即可。7、編程如果寫了一個test.c文件,要包含ffmpeg的頭文件,可以這樣寫:#include 編譯:gcc -o test test.c -lavformat -lavcodec -lavtuil (前提是有第6步的操作)如果沒有第6部的操作,則編譯的時候如下: gcc -o test test.c -I/usr/local/ffmpeg/include -L/usr/local/ffmpeg/lib -lavformat -lavcodec -lavtuil編譯成功之後,執行的時候還是需要動態庫的支持,還是要把那三個動態庫文件復制到/usr/lib或者/lib中,不然執行的時候會說找不到動態庫鏈接。還有一個方法可以解決這個問題,就是把/usr/local/ffmpeg/lib這個目錄加入到/etc/ld.so.config中,然後執行ldconfig,或者重啟電腦,這樣執行的時候系統就可以從/usr/local/ffmpeg/lib這個目錄下去找這三個動態庫文件了。以上的方式是採用動態庫編譯ffmpeg的,如果在configure的時候不加上--enable-shared的,則採用靜態鏈接的方式,不會生成那三個動態庫。同時生成的ffplay、ffmpeg的執行文件也比較的大,因為他們不需要動態庫的支持,就可以執行。但是不利於再次開發,所以我採用動態鏈接的方式。configure中還有很多的選項,可以通過./configure --help查看,也可以直接查看configure文件。這在配置的時候很重要。

⑵ linux ffmpeg 怎麼編64位

1、下載ffmpeg。
下載網址:http://www.ffmpeg.org/download.html
2、解壓縮
tar -zxvf ffmpeg-2.0.1.tar.gz
3、配置,生成Makefile
./configure --enable-shared --disable-yasm --prefix=/usr/local/ffmpeg
如果執行結果不對,可以根據提示信息,並查看幫助,解決問題
./configure --help
4、編譯安裝
make
make install
5、安裝之後在/usr/local/ffmpeg會看到有三個目錄
bin 執行文件目錄
lib 靜態,動態鏈接庫目錄
include 編程用到的頭文件
為了防止執行程序找不到庫文件,
可以將/usr/local/ffmpeg/lib目錄設置到LD_LIBRARY_PATH環境變數,
或者查看/usr/local/ffmpeg/lib下所有的鏈接,並在/usr/lib下建立同樣的鏈接。如下。
ln -s /usr/local/ffmpeg/lib/libavcodec.so /usr/lib/libavcodec.so
ln -s /usr/local/ffmpeg/lib/libavdevice.so /usr/lib/libavdevice.so
ln -s /usr/local/ffmpeg/lib/libavfilter.so /usr/lib/libavfilter.so
ln -s /usr/local/ffmpeg/lib/libavformat.so /usr/lib/libavformat.so
ln -s /usr/local/ffmpeg/lib/libavutil.so /usr/lib/libavutil.so
ln -s /usr/local/ffmpeg/lib/libswresample.so /usr/lib/libswresample.so
ln -s /usr/local/ffmpeg/lib/libswscale.so /usr/lib/libswscale.so
ln -s /usr/local/ffmpeg/lib/libavcodec.so /usr/lib/libavcodec.so.55
ln -s /usr/local/ffmpeg/lib/libavdevice.so /usr/lib/libavdevice.so.55
ln -s /usr/local/ffmpeg/lib/libavfilter.so /usr/lib/libavfilter.so.3
ln -s /usr/local/ffmpeg/lib/libavformat.so /usr/lib/libavformat.so.55
ln -s /usr/local/ffmpeg/lib/libavutil.so /usr/lib/libavutil.so.52
ln -s /usr/local/ffmpeg/lib/libswresample.so /usr/lib/libswresample.so.0
ln -s /usr/local/ffmpeg/lib/libswscale.so /usr/lib/libswscale.so.2

這時就需要在/etc/ld.so.conf下面加一行/usr/local/ffmpeg/lib,保存過後ldconfig一下,

這時就需要在/etc/ld.so.conf下面加一行/usr/local/MySQL/lib,保存過後ldconfig一下,

6、編譯測試程序
gcc -o ffmpegtest ffmpegtest.c -I/usr/local/ffmpeg/include -L/usr/local/ffmpeg/lib -lavformat -lavcodec -lavtuil
7、執行程序
./ffmpegtest
或直接執行/usr/local/ffmpeg/lib目錄下的./ffmpeg進行測試。

⑶ linux下安裝opencv必需要先安裝ffmpeg嗎

看到個類似的問題: www.avidemux.org/smf/index.php?topic=11974.0 你這個東西真不好說,不過看來是 x264 因為是靜態編譯,靜態編譯我記得需要別的函數庫也是靜態的。你這個應該是 x264 本身就有找不到的函數入口問題,導致現在傳染給了 ffmpeg

⑷ 【FFMPEG】NI Real time linux上安裝ffmpeg

由於需要在NI平台上使用ffmpeg庫,以實現網路媒體流。安裝過程與正常安裝有些許區別,記錄如下:

1. 硬體平台 NI-IC-373

2. ffmpeg 版本 ffmpeg-3.3.4

參考

/configure會報錯:pr command not found

Compile FFmpeg on Ubuntu, Debian, or Mint

參考: [FFmpeg-devel] [PATCH] Fix pkg-config detection when using a cross-prefix

註:如果需要安裝libx264支持,請參考

http://blog.csdn.net/li_wen01/article/details/62889494

http://www.cnblogs.com/gjianw217/p/3228455.html

環境變數

引用庫目錄

參考:  多線程的make

其他參考

1.  FFmpeg在Linux下編譯使用

2. ffmpeg 在linux下編譯

3. FFmpeg在Linux下安裝編譯過程

4. Linux-安裝FFmpeg

其他問題

1. Ffmpeg error in linux [closed]

2.  https://linuxserverguide.wordpress.com/2010/10/15/ffmpeg-error-while-loading-shared-libraries-libavdevice-so-52-cannot-open-shared-object-file/

⑸ 附加: 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中結構體很多。最關鍵的結構體可以分成以下幾類:

解協議(http,rtsp,rtmp,mms)

AVIOContext,URLProtocol,URLContext主要存儲視音頻使用的協議的類型以及狀態。URLProtocol存儲輸入視音頻使用的封裝格式。每種協議都對應一個URLProtocol結構。(注意:FFMPEG中文件也被當做一種協議「file」)

解封裝(flv,avi,rmvb,mp4)

AVFormatContext主要存儲視音頻封裝格式中包含的信息;AVInputFormat存儲輸入視音頻使用的封裝格式。每種視音頻封裝格式都對應一個AVInputFormat 結構。

解碼(h264,mpeg2,aac,mp3)

每個AVStream存儲一個視頻/音頻流的相關數據;每個AVStream對應一個AVCodecContext,存儲該視頻/音頻流使用解碼方式的相關數據;每個AVCodecContext中對應一個AVCodec,包含該視頻/音頻對應的解碼器。每種解碼器都對應一個AVCodec結構。

存數據

視頻的話,每個結構一般是存一幀;音頻可能有好幾幀

解碼前數據:AVPacket

解碼後數據:AVFrame

AVCodec

AVCodec是存儲編解碼器信息的結構體

const char *name:編解碼器的名字,比較短

const char *long_name:編解碼器的名字,全稱,比較長

enum AVMediaType type:指明了類型,是視頻,音頻,還是字幕

enum AVCodecID id:ID,不重復

const AVRational *supported_framerates:支持的幀率(僅視頻)

const enum AVPixelFormat *pix_fmts:支持的像素格式(僅視頻)

const int *supported_samplerates:支持的采樣率(僅音頻)

const enum AVSampleFormat *sample_fmts:支持的采樣格式(僅音頻)

const uint64_t channel_layouts:支持的聲道數(僅音頻)

int priv_data_size:私有數據的大小

1.注冊所有編解碼器:av_register_all();

2.聲明一個AVCodec類型的指針,比如說AVCodec

first_c;

3.調用av_codec_next()函數,即可獲得指向鏈表下一個解碼器的指針,循環往復可以獲得所有解碼器的信息。注意,如果想要獲得指向第一個解碼器的指針,則需要將該函數的參數設置為NULL。

AVCodecContext

這是一個描述編解碼器上下文的數據結構,包含了眾多編解碼器需要的參數信息

如果是單純使用libavcodec,這部分信息需要調用者進行初始化;如果是使用整個FFMPEG庫,這部分信息在調用 av_open_input_file和av_find_stream_info的過程中根據文件的頭信息及媒體流內的頭部信息完成初始化。其中幾個主要 域的釋義如下:

extradata/extradata_size: 這個buffer中存放了解碼器可能會用到的額外信息,在av_read_frame中填充。一般來說,首先,某種具體格式的demuxer在讀取格式頭 信息的時候會填充extradata,其次,如果demuxer沒有做這個事情,比如可能在頭部壓根兒就沒有相關的編解碼信息,則相應的parser會繼 續從已經解復用出來的媒體流中繼續尋找。在沒有找到任何額外信息的情況下,這個buffer指針為空。

time_base:

width/height:視頻的寬和高。

sample_rate/channels:音頻的采樣率和信道數目。

sample_fmt: 音頻的原始采樣格式。

codec_name/codec_type/codec_id/codec_tag:編解碼器的信息。

AVStream

該結構體描述一個媒體流

主要域的釋義如下,其中大部分域的值可以由av_open_input_file根據文件頭的信息確定,缺少的信息需要通過調用av_find_stream_info讀幀及軟解碼進一步獲取:

index/id:index對應流的索引,這個數字是自動生成的,根據index可以從AVFormatContext::streams表中索引到該流;而id則是流的標識,依賴於具體的容器格式。比如對於MPEG TS格式,id就是pid。

time_base:流的時間基準,是一個實數,該流中媒體數據的pts和dts都將以這個時間基準為粒度。通常,使用av_rescale/av_rescale_q可以實現不同時間基準的轉換。

start_time:流的起始時間,以流的時間基準為單位,通常是該流中第一個幀的pts。

ration:流的總時間,以流的時間基準為單位。

need_parsing:對該流parsing過程的控制域。

nb_frames:流內的幀數目。

r_frame_rate/framerate/avg_frame_rate:幀率相關。

codec:指向該流對應的AVCodecContext結構,調用av_open_input_file時生成。

parser:指向該流對應的AVCodecParserContext結構,調用av_find_stream_info時生成。

AVFormatContext

這個結構體描述了一個媒體文件或媒體流的構成和基本信息

這是FFMpeg中最為基本的一個結構,是其他所有結構的根,是一個多媒體文件或流的根本抽象。其中:nb_streams和streams所表示的AVStream結構指針數組包含了所有內嵌媒體流的描述;iformat和oformat指向對應的demuxer和muxer指針;pb則指向一個控制底層數據讀寫的ByteIOContext結構。

start_time和ration是從streams數組的各個AVStream中推斷出的多媒體文件的起始時間和長度,以微妙為單位。

通常,這個結構由av_open_input_file在內部創建並以預設值初始化部分成員。但是,如果調用者希望自己創建該結構,則需要顯式為該結構的一些成員置預設值——如果沒有預設值的話,會導致之後的動作產生異常。以下成員需要被關註:

probesize

mux_rate

packet_size

flags

max_analyze_ration

key

max_index_size

max_picture_buffer

max_delay

AVPacket

AVPacket定義在avcodec.h中

FFMPEG使用AVPacket來暫存解復用之後、解碼之前的媒體數據(一個音/視頻幀、一個字幕包等)及附加信息(解碼時間戳、顯示時間戳、時長等)。其中:

dts 表示解碼時間戳,pts表示顯示時間戳,它們的單位是所屬媒體流的時間基準。

stream_index 給出所屬媒體流的索引;

data 為數據緩沖區指針,size為長度;

ration 為數據的時長,也是以所屬媒體流的時間基準為單位;

pos 表示該數據在媒體流中的位元組偏移量;

destruct 為用於釋放數據緩沖區的函數指針;

flags 為標志域,其中,最低為置1表示該數據是一個關鍵幀。

AVPacket 結構本身只是個容器,它使用data成員指向實際的數據緩沖區,這個緩沖區可以通過av_new_packet創建,可以通過    av_p_packet 拷貝,也可以由FFMPEG的API產生(如av_read_frame),使用之後需要通過調用av_free_packet釋放。

av_free_packet調用的是結構體本身的destruct函數,它的值有兩種情況:(1)av_destruct_packet_nofree或 0;(2)av_destruct_packet,其中,前者僅僅是將data和size的值清0而已,後者才會真正地釋放緩沖區。FFMPEG內部使用 AVPacket結構建立緩沖區裝載數據,同時提供destruct函數,如果FFMPEG打算自己維護緩沖區,則將destruct設為 av_destruct_packet_nofree,用戶調用av_free_packet清理緩沖區時並不能夠將其釋放;如果FFMPEG不會再使用 該緩沖區,則將destruct設為av_destruct_packet,表示它能夠被釋放。對於緩沖區不能夠被釋放的AVPackt,用戶在使用之前 最好調用av_p_packet進行緩沖區的克隆,將其轉化為緩沖區能夠被釋放的AVPacket,以免對緩沖區的不當佔用造成異常錯誤。而 av_p_packet會為destruct指針為av_destruct_packet_nofree的AVPacket新建一個緩沖區,然後將原 緩沖區的數據拷貝至新緩沖區,置data的值為新緩沖區的地址,同時設destruct指針為av_destruct_packet。

AVFrame

構體保存的是解碼後和原始的音視頻信息。AVFrame通過函數av_frame_alloc()初始化,該函數僅僅分配AVFrame實例本身,而沒有分配其內部的緩存。AVFrame實例由av_frame_free()釋放;AVFrame實例通常分配一次,重復使用,如分配一個AVFrame實例來保留解碼器中輸出的視頻幀(此時應在恰當的時候使用av_frame_unref()清理參考幀並將AVFrame歸零)。該類所描述的數據通常由AVBuffer的API來保存一個引用計數,並保存於AVFrame.buf

/AVFrame.extended_buf,在至少存在一個參考的時候(如AVFrame.buf[0] != NULL),則該對象被標記為「被引用」。在此情況下,AVFrame所包含的每一組數據必須包含於AVFrame的緩存中。

AAC格式ADTS

ADTS流 跟Raw流,

1.ADTS是個啥

ADTS全稱是(Audio Data Transport Stream),是AAC的一種十分常見的傳輸格式。

AAC解碼器都需要把AAC的ES流打包成ADTS的格式,一般是在AAC ES流前添加7個位元組的ADTS header。也就是說你可以吧ADTS這個頭看作是AAC的frameheader。

ffmpeg寫 mp4+aac時呢,音頻有兩個值得注意的地方。

1 寫aac音頻時,要添加兩個位元組的信息到AVCodecContext.

2 ffmpeg 寫AAC音頻數據不能含有ADTS頭

在AAC ES流前添加7個位元組的ADTS header。也就是說你可以吧ADTS這個頭看作是AAC的frameheader。

tvOS必須要支持 bitcode. (iOS bitcode項可選的) 所以在編譯的時候Makefile要加上 CFLAGS= -fembed-bitcode 。 如果用xcode編譯lib,要在Build Settings—>custom compiler flags —>cflags 加上OTHER_CFLAGS="-fembed-bitcode" 。

FFmpeg優化

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

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

YUV->RGB  OpenGLES shader來顯示。

FFmpeg轉碼

1.分離視頻音頻流

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

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

2.視頻解復用

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

ffmpeg –i test.avi –vcodec –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 –acodec 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 -acodec output.avi    //剪切視頻

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

6.視頻錄制

ffmpeg –i rtsp://192.168.3.205:5555/test –vcodec 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) mp_format()

其他函數:

(1) avpicture_deinterlace()

(2) ImgReSampleContext()

⑹ FFmpeg之Linux下編譯與調試

下面的一切都是在 root 模式下進行的,可以不再 root 模式下進行

基礎環境就是編譯代碼的基礎庫,Ubuntu聯網安裝軟體很簡單,一個語句即可搞定,這里列出語句如下:

依賴庫分兩方面,參考以下網站列出的依賴庫信息,本文選擇的版本均參考於此網頁: FFmpeg依賴庫信息

首先創建 FFmpeg 代碼目錄,所有的源代碼放在這個目錄下

FFmpeg 編譯之後,即可使用。編譯生成的可執行程序在 ~/bin 目錄下

註:上面的 ./configure 配置編譯後並不能進行調試,需要如下配置.

剛才的工程可以運行,但不能debug。解決此問題,首先認定一點,生成的可執行程序中,ffmpeg 不包含調試信息,調試信息在 ffmpeg_g 中,debug 要選擇 ffmpeg_g。

另外,./config選項也是確定包含調試信息的核心,需要在config中添加:

採用以下命令重新config:

一些注意事項; 在使用 ffplay 播放生成 h264 格式的視頻時,播放速度會加快,解決方式:不要使用 FFmpeg 轉碼生成純 h264 格式的視頻,要使用一種容器包含 h264 視頻,即生成一種音視頻流格式,也就是不要生成純粹的 h264 碼流,而是生成諸如 mkv 等格式的文件。

⑺ ffmpeg安裝在linux哪個目錄

Linux下ffmpeg的完整安裝
最近在做一個企業項目, 期間需要將用戶上傳的視頻轉成flv格式或mp4格式並用flash插件在前端播放, 我決定採用ffmpeg (http://www.ffmpeg.org/ )實現. 當然以前也用過ffmpeg, 但是沒有安裝額外的庫, 只是源代碼下簡單地 ./configure, 最後發現好多功能都用不了, 比如最流行的x264編碼器. 所以決心完整地安裝一下ffmpeg, 經過兩天痛苦地折騰, 終於成功了, 現在將過程記錄下來. 主要參考了 [1] 和 [2] 兩篇博文, 其中 [1] 是2007年寫成的, 其中所提到的依賴庫版本比較老, 本人安裝的都是相應最新的版本.

首先要安裝各種解碼器

1、lame
lame-3.99.5.tar.gz
Url:http://sourceforge.net/project/showfiles.php?group_id=290&package_id=309
安裝方法如下:
1 tar -zxvf lame-3.99.5.tar.gz
2 cd lame-3.99.5
3 ./configure --enable-shared 4 make
5 make install

2、libogg
libogg-1.3.1.tar.gz
Url:http://www.xiph.org/downloads/
安裝方法如下:
3、libvorbis
libvorbis-1.3.3.tar.gz
Url:http://downloads.xiph.org/releases/vorbis/libvorbis-1.3.3.tar.gz
(libvorbis依賴於libogg, 所以libogg必須先於libvorbis安裝)
安裝方法如下:
1 ./configure 2 make
3 make install

4、xvid
xvidcore-1.3.2.tar.gz
Url:http://downloads.xvid.org/downloads/xvidcore-1.3.2.tar.gz
安裝方法如下:
5、x264
latest_x264.tar.bz2 (其中包含的目錄是 x264-snapshot-20131023-2245)
Url:http://www.videolan.org/developers/x264.html
ftp://ftp.videolan.org/pub/videolan/x264/snapshots/
安裝方法如下:

1
2
3
4

1 tar -jxvf latest_x264.tar.bz2
2 ./configure
3 make
4 make install

6、libdts
libdca-0.0.5.tar.bz2
Url: http://www.videolan.org/developers/libdca.html
安裝方法:
7、a52
a52dec-0.7.4.tar.gz (這個庫從2002年就沒有更新過了)
http://liba52.sourceforge.net/downloads.html
安裝方法:
8、faad2
faad2-2.7.tar.gz
http://www.audiocoding.com/downloads.html
安裝方法
9、faac
faac-1.28.tar.gz
http://www.audiocoding.com/downloads.html
安裝方法:
10、amr-nb
amrnb-10.0.0.0.tar.bz2
http://ftp.penguin.cz/pub/users/utx/amr/ ( 從此處下載最新版本 )
安裝方法:
11、amr-wb
amrwb-7.0.0.1.tar.bz2
http://ftp.penguin.cz/pub/users/utx/amr/ ( 從此處下載最新版本 )
安裝方法:
1 ./configure 2 make
3 make install

12、最關鍵的一步, 安裝ffmpeg

1
2
3

1 ./configure --prefix=/usr/local/ffmpeg2 --enable-libmp3lame --enable-libvorbis --enable-gpl --enable-version3 --enable-nonfree --enable-pthreads --enable-libfaac --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libx264 --enable-libxvid --enable-postproc --enable-ffserver --enable-ffplay
2 make
3 make install

在./configure的時候會報錯, 提示說沒有libopencore-amrnb和libopencore-amrwb兩個庫. 我參考了 [2], 使用如下命令安裝它們:

1

sudo apt-get install libopencore-amrnb-dev libopencore-amrwb-dev

如果./configure的時候加入 --enable-shared, 編譯安裝沒有問題. 但是運行ffmpeg命令就會出錯:

1

relocation error: /usr/local/lib/libavfilter.so.3: symbol sws_get_class, version LIBSWSCALE_2 not defined in file libswscale.so.2 with link time reference;

這時可以參考 [3], 大意是說跟gstreamer的動態庫沖突了, 要卸載gstreamer. 但是如果卸載了gstreamer我的多媒體軟體多不能用了. 所以我卸載了ffmpeg並重新編譯成靜態庫. 安裝完之後, 運行ffmpeg成功, 輸出如下:

1
2
3
4
5
6
7
8
9
10
11
12
13

ffmpeg version 2.0.1 Copyright (c) 2000-2013 the FFmpeg developers
built on Oct 25 2013 17:40:51 with gcc 4.6 (Ubuntu/Linaro 4.6.3-1ubuntu5)
configuration: --prefix=/usr/local/ffmpeg2 --enable-libmp3lame --enable-libvorbis --enable-gpl --enable-version3 --enable-nonfree --enable-pthreads --enable-libfaac --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libx264 --enable-libxvid --enable-postproc --enable-ffserver --enable-ffplay
libavutil 52. 38.100 / 52. 38.100
libavcodec 55. 18.102 / 55. 18.102
libavformat 55. 12.100 / 55. 12.100
libavdevice 55. 3.100 / 55. 3.100
libavfilter 3. 79.101 / 3. 79.101
libswscale 2. 3.100 / 2. 3.100
libswresample 0. 17.102 / 0. 17.102
libpostproc 52. 3.100 / 52. 3.100
Hyper fast Audio and Video encoder
usage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}...

[1] http://yezi.iteye.com/blog/139399
[2] http://www.learndiary.com/2011/04/ubuntu-linux-%E4%B8%8B-ffmpeg-%E5%8F%8A-mencoder-%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8%E5%B0%8F%E7%BB%93/
[3] http://blog.csdn.net/nil_foc/article/details/6547047

熱點內容
安卓怎麼開啟位置 發布:2023-01-30 21:53:45 瀏覽:476
上傳作業的傳 發布:2023-01-30 21:50:57 瀏覽:866
資料庫表的外鍵 發布:2023-01-30 21:41:30 瀏覽:588
華為9選哪個配置 發布:2023-01-30 21:40:43 瀏覽:941
雲伺服器gpu 發布:2023-01-30 21:33:26 瀏覽:544
發票忘記密碼如何列印 發布:2023-01-30 21:30:25 瀏覽:580
手機照片怎樣壓縮打包 發布:2023-01-30 21:30:12 瀏覽:276
軟體怎麼壓縮 發布:2023-01-30 21:29:19 瀏覽:570
如何將安卓手機屏幕投送到電腦上 發布:2023-01-30 21:28:10 瀏覽:520
c多線程編譯 發布:2023-01-30 21:27:50 瀏覽:393