ffmpeg [global_options]{[input_file_option] –i input_file}…{[output_file_options] output_file}算法
ffmpeg [全局選項]{[輸入文件設置] -i 輸入文件}…{[輸出文件設置] 輸出文件}服務器
ffmpeg 是一個很是快速的視頻音頻轉換器,還能夠抓取實時的音頻/視頻流。它能夠在任意的採樣率之間轉換調整視頻,也能夠用高質量的多相濾波器動態的調整視頻的大小。網絡
ffmpeg能夠從任意數量的輸入「文件」(它能夠是常規文件,管道,網絡數據流,抓取設備等)中讀取,由-i 選項指定,能夠寫入任意數量的輸出文件,這些文件由普通的輸出文件名字指定。任何在命令行裏不能被解釋爲一個選項的都會被認爲是一個輸出文件名稱。ide
原則上,每一個輸入或者輸出文件都包含任意數量不一樣類型(視頻/音頻/字幕/附件/數據)數據的流。這些輸入/輸出的流的數量和類型被容器格式限制。輸入流和輸出流識別映射會自動完成或者用-map選項給定。工具
在選項中引入輸入文件,你必須用這樣的索引(基於0),這個第一個輸入的文件是0,第二個輸入文件是1等等。文件中的流是由它們的索引引用的。例2 3指的是第三個輸入文件中的第4個流。oop
作爲通常的原則,選項會被用到下一個指定的文件。所以,順序很重要,你能夠屢次在命令行上擁有相同的選項。而後每個事件應用到下一個輸入或輸出文件中。這個規則例外的是全局選項(例如 verbosity 級別),應該被首先指定。性能
不要混淆輸入和輸出文件。首先指定全部輸入文件,而後是全部的輸出文件。也不要混淆屬於不一樣文件的選項。全部的選項應用僅僅在它後面的輸入輸出文件並且在文件之間能夠從新設置。測試
l 將輸出文件的視頻比特率設置成64kbit/s:編碼
ffmpeg -i input.avi -b :v 64k –bufsize 64k output.avispa
l 強制將輸出文件的幀率設置成24fps:
ffmpeg -i input.avi –r 24 output.avi
l 強制將輸入文件(僅僅對原始格式有效)的幀率設置成1fps,輸出文件幀率設置成24fps:
ffmpeg -r 1 –I input.m2v -r 24 output.avi
對於原始的輸入文件可能須要格式設置選項。
Ffmpeg 的每一個輸出的轉換過程均可以經過下圖來描述:
_______ ______________
| | | |
| input | demuxer | encoded data | decoder
| file | ---------> | packets | -----+
|_______| |______________| |
v
_________
| |
| decoded |
| frames |
|_________|
________ ______________ |
| | | | |
| output | <-------- | encoded data | <----+
| file | muxer | packets | encoder
|________| |______________|
ffmpeg 經過libavformat庫(包含demuxers)來讀取輸入文件而後獲取包含數據編碼的數據包。當有多個輸入文件時,ffmpeg會經過跟蹤全部輸入流經過跟蹤最低的時間戳來實現同步。
編碼後的包被傳遞給解碼器(除非是數據流拷貝)。解碼器產生未壓縮的數據幀(原始視頻/pcm音頻/…)。而後能夠經過過濾器進一步處理。濾波後,幀被傳遞給編碼器,編碼器輸出編碼包。最終觸底給muxer,而後將編碼包寫入到輸出文件中。
在編碼前,ffmpeg會經過libavfilter庫處理原始的音頻和視頻幀。幾個濾波器經過鏈接造成濾波器圖。ffmpeg能夠區分簡單和複雜的濾波器圖。
簡單的過濾器是隻有一路相同類型的輸入和輸出。在上面的圖表中,能夠通關過插入一個簡單的額外的步驟來講明編碼和解碼:
_________ ______________
| | | |
| decoded | | encoded data |
| frames |\ _ | packets |
|_________| \ /||______________|
\ __________ /
simple _\|| | / encoder
filtergraph | filtered |/
| frames |
|__________|
簡單濾波器試着每一個數據流的濾波選項(視頻和音頻分別用-vf和-af的別名)。一個簡單的視頻濾波過程能夠看下面的例子:
_______ _____________ _______ ________
| | | | | | | |
| input | ---> | deinterlace | ---> | scale | ---> | output |
|_______| |_____________| |_______| |________|
須要注意的是一些濾波器改變幀的屬性可是不會改變幀的內容。例如在上面的例子中fps濾波器只改變了幀數可是沒有改變幀的內容。另外的例子setpts濾波器只是設置了時間戳並無改變經過的幀內容。
複雜的濾波器不能描述成簡單的線性處理鏈應用在一個數據流上。狀況是這樣的,例如,下面這個圖有多個輸入或者輸出,或者當輸入流和輸出流的類型不一樣。能夠下圖來表示。
_________
| |
| input 0 |\ __________
|_________| \ | |
\ _________ /| output 0 |
\ | | / |__________|
_________ \| complex | /
| | | |/
| input 1 |---->| filter |\
|_________| | | \ __________
/| graph | \ | |
/ | | \| output 1 |
_________ / |_________| |__________|
| | /
| input 2 |/
|_________|
複雜的濾波器經過 –filter 設置複雜選項注意那是全局的選項。所以複雜的濾波器對流的性質不能簡單的與單個的流或者文件相關。
-lavfi 選項等價於 –filter_complex
一個複雜的過濾圖的一個簡單例子是疊加過濾器,它有兩個視頻輸入和一個視頻輸出,包含一個重疊在另外一個視頻上的視頻。它的音頻對應的是amix濾波器。
流複製是經過向-codec選項提供複製參數而選擇的模式。它使ffmpeg省略了指定流的解碼和編碼步驟,所以它只進行了刪除和muxing。它對於更改容器格式或修改容器級別的元數據很是有用。上面的圖表,在這個例子中,簡化爲:
_______ ______________ ________
| | | | | |
| input | demuxer | encoded data | muxer | output |
| file | ---------> | packets | -------> | file |
|_______| |______________| |________|
因爲沒有解碼或編碼,因此速度很是快,沒有質量損失。然而,在某些狀況下,它可能不會起做用,由於有許多因素。顯然,應用過濾器也是不可能的,由於過濾器能夠處理未壓縮的數據。
默認狀況下,ffmpeg只包含輸入文件中的每一個類型(視頻、音頻、字幕)的一個流,並將它們添加到每一個輸出文件中。它根據如下標準選擇「最佳」:對於視頻來講,它是具備最高分辨率的流,對於音頻來講,它是擁有最多頻道的流,對於字幕來講,它是第一個字幕流。在相同類型的幾個流相同的狀況下,選擇了最低索引的流。
您可使用-vn/-an/-sn選項來禁用某些默認值。對於完整的手動控制,使用-map選項,它禁用剛剛描述的默認值。
FFmpeg是一個開源免費跨平臺的視頻和音頻流方案,屬於自由軟件,採用LGPL或GPL許可證(依據你選擇的組件)。它提供了錄製、轉換以及流化音視頻的完整解決方案。它包含了很是先進的音頻/視頻編解碼庫libavcodec,爲了保證高可移植性和編解碼質量,libavcodec裏不少codec都是從頭開發的。
FFmpeg在Linux平臺下開發,但它一樣也能夠在其它操做系統環境中編譯運行,包括Windows、Mac OS X等。
FFmpeg項目由如下幾部分組成:
FFMpeg 視頻文件轉換命令行工具,也支持通過實時電視卡抓取和編碼成視頻文件。
FFServer 基於HTTP(RTSP正在開發中)用於實時廣播的多媒體服務器,也支持時間平移.
FFplay 用SDL和FFmpeg庫開發的一個簡單的媒體播放器.
libavcodec 一個包含了全部FFmpeg音視頻編解碼器的庫.爲了保證最優性能和高可複用性,大多數編解碼器從頭開發的.
libavformat 一個包含了全部的普通音視格式的解析器和產生器的庫.
例子:ffmpeg -y -i "1.avi" -title "Test" -vcodec xvid -s 368x208 -r 29.97 -b 1500 -acodec aac -ac 2 -ar 24000 -ab 128 -vol 200 -f psp -muxvb 768 "output.wmv"
解釋:以上命令能夠在Dos命令行中輸入,也能夠建立到批處理文件中運行。不過,前提是:要在ffmpeg所在的目錄中執行(轉換君所在目錄下面的cores子目錄)。
輸入輸出文件一般就是待處理的多媒體文件了。能夠是純粹的音頻文件,純粹的視頻文件,或者混合的。大部分常見的格式都可以「通殺」。象常見的各類mpeg,AVI封裝的DIVX和Xvid等等,具體的格式支持列表可使用ffmpeg -formats查看或直接查閱文檔。
另:因爲Linux把設備視爲文件,所以-i選項後能夠跟設備名。好比DV,視頻卡,光驅或者其它的各種設備。
參數:
-y 覆蓋輸出文件,即若是 output.wmv 文件已經存在的話,不經提示就覆蓋掉
-i "1.avi" 輸入文件是和ffmpeg在同一目錄下的1.avi文件,能夠本身加路徑,更名字
-title "Test" 在PSP中顯示的影片的標題
-vcodec xvid 使用XVID編碼壓縮視頻,不能改的,對應的庫爲libxvid
-s 368x208 輸出的分辨率爲368x208,注意片源必定要是16:9的否則會變形
-r 29.97 幀數,通常就用這個吧
-b 1500 視頻數據流量,用-b xxxx的指令則使用固定碼率,數字隨便改,1500以上沒效果;還能夠用動態碼率如:-qscale 4和-qscale 6,4的質量比6高
-acodec aac 音頻編碼用AAC 對應的庫爲libfaac
-ac 2 聲道數1或2
-ar 24000 聲音的採樣頻率,好像PSP只能支持24000Hz
-ab 128 音頻數據流量,通常選擇3二、6四、9六、128
-vol 200 200%的音量,本身改
-muxvb 768 好像是給PSP機器識別的碼率,通常選擇38四、512和768,我改爲1500,PSP就說文件損壞了
-f psp 輸出psp專用格式
"output.wmv" 輸出文件名,也能夠加路徑改文件名
示例1:
截取一張352x240尺寸大小的,格式爲jpg的圖片:
ffmpeg -i test.asf -y -f image2 -t 0.001 -s 352x240 a.jpg
示例2:
把視頻的前30幀轉換成一個Animated Gif :
ffmpeg -i test.asf -vframes 30 -y -f gif a.gif
示例3:
在視頻的第8.01秒處截取 352*240 的縮略圖
ffmpeg -i test2.asf -y -f image2 -ss 08.010 -t 0.001 -s 352x240 b.jpg
a) 通用選項
-L license
-h 幫助
-fromats 顯示可用的格式,編解碼的,協議的。。。
-f fmt 強迫採用格式fmt
-i filename 輸入文件
-y 覆蓋輸出文件
-t duration 設置紀錄時間 hh:mm:ss[.xxx]格式的記錄時間也支持
-ss position 搜索到指定的時間 [-]hh:mm:ss[.xxx]的格式也支持
-title string 設置標題
-author string 設置做者
-copyright string 設置版權
-comment string 設置評論
-target type 設置目標文件類型(vcd,svcd,dvd) 全部的格式選項(比特率,編解碼以及緩衝區大小)自動設置 ,只須要輸入以下的就能夠了:
ffmpeg -i myfile.avi -target vcd /tmp/vcd.mpg
-hq 激活高質量設置
-itsoffset offset 設置以秒爲基準的時間偏移,該選項影響全部後面的輸入文件。該偏移被加到輸入文件的時戳,定義一個正偏移意味着相應的流被延遲了 offset秒。 [-]hh:mm:ss[.xxx]的格式也支持
b) 視頻選項
-b bitrate 設置比特率,缺省200kb/s
-r fps 設置幀頻 缺省25
-s size 設置幀大小 格式爲WXH 缺省160X128.下面的簡寫也能夠直接使用:
Sqcif 128X96 qcif 176X144 cif 252X288 4cif 704X576
-aspect aspect 設置橫縱比 4:3 16:9 或 1.3333 1.7777
-croptop size 設置頂部切除帶大小 像素單位
-cropbottom size –cropleft size –cropright size
-padtop size 設置頂部補齊的大小 像素單位
-padbottom size –padleft size –padright size –padcolor color 設置補齊條顏色(hex,6個16進制的數,紅:綠:蘭排列,好比 000000表明黑色)
-vn 不作視頻記錄
-bt tolerance 設置視頻碼率容忍度kbit/s
-maxrate bitrate設置最大視頻碼率容忍度
-minrate bitreate 設置最小視頻碼率容忍度
-bufsize size 設置碼率控制緩衝區大小
-vcodec codec 強制使用codec編解碼方式。 若是用copy表示原始編解碼數據必須被拷貝。
-sameq 使用一樣視頻質量做爲源(VBR)
-pass n 選擇處理遍數(1或者2)。兩遍編碼很是有用。第一遍生成統計信息,第二遍生成精確的請求的碼率
-passlogfile file 選擇兩遍的紀錄文件名爲file
c)高級視頻選項
-g gop_size 設置圖像組大小
-intra 僅適用幀內編碼
-qscale q 使用固定的視頻量化標度(VBR)
-qmin q 最小視頻量化標度(VBR)
-qmax q 最大視頻量化標度(VBR)
-qdiff q 量化標度間最大誤差 (VBR)
-qblur blur 視頻量化標度柔化(VBR)
-qcomp compression 視頻量化標度壓縮(VBR)
-rc_init_cplx complexity 一遍編碼的初始複雜度
-b_qfactor factor 在p和b幀間的qp因子
-i_qfactor factor 在p和i幀間的qp因子
-b_qoffset offset 在p和b幀間的qp誤差
-i_qoffset offset 在p和i幀間的qp誤差
-rc_eq equation 設置碼率控制方程 默認tex^qComp
-rc_override override 特定間隔下的速率控制重載
-me method 設置運動估計的方法 可用方法有 zero phods log x1 epzs(缺省) full
-dct_algo algo 設置dct的算法 可用的有 0 FF_DCT_AUTO 缺省的DCT 1 FF_DCT_FASTINT 2 FF_DCT_INT 3 FF_DCT_MMX 4 FF_DCT_MLIB 5 FF_DCT_ALTIVEC
-idct_algo algo 設置idct算法。可用的有 0 FF_IDCT_AUTO 缺省的IDCT 1 FF_IDCT_INT 2 FF_IDCT_SIMPLE 3 FF_IDCT_SIMPLEMMX 4 FF_IDCT_LIBMPEG2MMX 5 FF_IDCT_PS2 6 FF_IDCT_MLIB 7 FF_IDCT_ARM 8 FF_IDCT_ALTIVEC 9 FF_IDCT_SH4 10 FF_IDCT_SIMPLEARM
-er n 設置錯誤殘留爲n 1 FF_ER_CAREFULL 缺省 2 FF_ER_COMPLIANT 3 FF_ER_AGGRESSIVE 4 FF_ER_VERY_AGGRESSIVE
-ec bit_mask 設置錯誤掩蔽爲bit_mask,該值爲以下值的位掩碼 1 FF_EC_GUESS_MVS (default=enabled) 2 FF_EC_DEBLOCK (default=enabled)
-bf frames 使用frames B 幀,支持mpeg1,mpeg2,mpeg4
-mbd mode 宏塊決策 0 FF_MB_DECISION_SIMPLE 使用mb_cmp 1 FF_MB_DECISION_BITS 2 FF_MB_DECISION_RD
-4mv 使用4個運動矢量 僅用於mpeg4
-part 使用數據劃分 僅用於mpeg4
-bug param 繞過沒有被自動監測到編碼器的問題
-strict strictness 跟標準的嚴格性
-aic 使能高級幀內編碼 h263+
-umv 使能無限運動矢量 h263+
-deinterlace 不採用交織方法
-interlace 強迫交織法編碼 僅對mpeg2和mpeg4有效。當你的輸入是交織的而且你想要保持交織以最小圖像損失的時候採用該選項。可選的方法是不交織,可是損失更大
-psnr 計算壓縮幀的psnr
-vstats 輸出視頻編碼統計到vstats_hhmmss.log
-vhook module 插入視頻處理模塊 module 包括了模塊名和參數,用空格分開
d)音頻選項
-ab bitrate 設置音頻碼率
-ar freq 設置音頻採樣率
-ac channels 設置通道 缺省爲1
-an 不使能音頻紀錄
-acodec codec 使用codec編解碼
e)音頻/視頻捕獲選項
-vd device 設置視頻捕獲設備。好比/dev/video0
-vc channel 設置視頻捕獲通道 DV1394專用
-tvstd standard 設置電視標準 NTSC PAL(SECAM)
-dv1394 設置DV1394捕獲
-av device 設置音頻設備 好比/dev/dsp
f)高級選項
-map file:stream 設置輸入流映射
-debug 打印特定調試信息
-benchmark 爲基準測試加入時間
-hex 傾倒每個輸入包
-bitexact 僅使用位精確算法 用於編解碼測試
-ps size 設置包大小,以bits爲單位
-re 以本地幀頻讀數據,主要用於模擬捕獲設備
-loop 循環輸入流。只工做於圖像流,用於ffserver測試