1、FFmpeg簡介
FFmpeg是一款很是快速的視頻和音頻轉換器, 是開源項目 FFmpeg (Fast Forward moving pictures expert group) 的命令行程序。 它能夠在任意採樣率之間轉換,並經過高質量的多相濾波器實時調整視頻大小。html
FFmpeg程序的轉碼流程,以下所示算法
_______ ______________
| | | |
| input | demuxer | encoded data | decoder
| file | ---------> | packets | -----+
|_______| |______________| |
v
_________
| |
| decoded |
| frames |
|_________|
________ ______________ |
| | | | |
| output | <-------- | encoded data | <----+
| file | muxer | packets | encoder
|________| |______________|
其中, demuxer 爲解複用器, muxer 爲複用器; decoder 爲解碼器, encoder 爲編碼器
2、關於FFmpeg的參數
一、通用選項
-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 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
三、高級視頻選項
-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
四、音頻選項
-ab bitrate 設置音頻碼率
-ar freq 設置音頻採樣率
-ac channels 設置通道 缺省爲1
-an 不使能音頻紀錄
-acodec codec 使用codec編解碼
五、音頻/視頻捕獲選項
-vd device 設置視頻捕獲設備。好比/dev/video0
-vc channel 設置視頻捕獲通道 DV1394專用
-tvstd standard 設置電視標準 NTSC PAL(SECAM)
-dv1394 設置DV1394捕獲
-av device 設置音頻設備 好比/dev/dsp
六、高級選項
-map file:stream 設置輸入流映射
-debug 打印特定調試信息
-benchmark 爲基準測試加入時間
-hex 傾倒每個輸入包
-bitexact 僅使用位精確算法 用於編解碼測試
-ps size 設置包大小,以bits爲單位
-re 以本地幀頻讀數據,主要用於模擬捕獲設備
-loop 循環輸入流。只工做於圖像流,用於ffserver測試
3、實戰操做
一、測試轉碼
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"
-
-y 覆蓋輸出文件,即若是 output.wmv 文件已經存在的話,不經提示就覆蓋掉bash
-
-i "1.avi" 輸入文件是和ffmpeg在同一目錄下的1.avi文件,能夠本身加路徑,更名字app
-
-title "Test" 在PSP中顯示的影片的標題ide
-
-vcodec xvid 使用XVID編碼壓縮視頻,不能改的oop
-
-s 368x208 輸出的分辨率爲368x208,注意片源必定要是16:9的否則會變形post
-
-r 29.97 幀數,通常就用這個吧測試
-
-b 1500 視頻數據流量,用-b xxxx的指令則使用固定碼率,數字隨便改,1500以上沒效果;還能夠用動態碼率如:-qscale 4和-qscale 6,4的質量比6高ui
-
-acodec aac 音頻編碼用AAC編碼
-
-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" 輸出文件名,也能夠加路徑改文件名
二、視頻裁剪
ffmpeg -ss 00:00:00 -t 00:00:03 -y -i test.mp4 -vcodec copy -acodec copy test1.mp4 #視頻裁剪
將test.mp4視頻的前3秒,從新生成一個新視頻
-
-ss 開始時間,如: 00:00:00,表示從0秒開始,格式也能夠00:00:0
-
-t 時長,如: 00:00:03,表示截取3秒長的視頻,格式也能夠00:00:3
-
-y 若是文件已存在強制替換;
-
-i 輸入,後面是空格,緊跟着就是輸入視頻文件;
-
-vcodec copy 和 -acodec copy表示所要使用的視頻和音頻的編碼格式,這裏指定爲copy表示原樣拷貝;
三、視頻截圖
ffmpeg -i test.mp4 -y -f mjpeg -ss 3 -t 1 test1.jpg
ffmpeg -i test.mp4 -y -f image2 -ss 3 -vframes 1 test1.jpg
在第三秒的時候,截圖
四、獲取視頻時長
ffmpeg -i test.mp4 2>&1 | grep 'Duration' | cut -d ' ' -f 4 | sed s/,//
五、flv格式轉換
# ffmpeg -i test.mp4 -ab 56 -ar 22050 -qmin 2 -qmax 16 -b 320k -r 15 -s 320x240 outputfile.flv #mp4 轉 flv
# ffmpeg -i outputfile.flv -copyts -strict -2 test.mp4 #flv 轉 mp4
六、視頻加水印
ffmpeg -y -i test.mp4 -acodec copy -vf "movie=uwsgi.jpg [logo]; [in][logo] overlay=10:10:1 [out]" test2.mp4
overlay=10:10:1,後三個數據表示是距離左邊的距離,距離上邊的距離,是否透明,1表示透明。上例我用的是jpg,固然不可能透明。
ffmpeg -y -i test.mp4 -acodec copy -vf "movie=uwsgi.jpg [logo]; [in][logo] overlay=enable='lte(t,1)' [out]" test2.mp4
overlay=enable='lte(t,1)' ,這個參數表示,水印在前一秒顯示。
七、生成GIF圖片
ffmpeg -i test.asf -vframes 30 -y -f gif a.gif #把視頻的前30幀轉換成一個Gif
ffmpeg -i test2.mp4 -y -f image2 -ss 08 -t 0.001 -s 352x240 b.jpg #在秒處接取一個352X240的圖片
八、下載RTMP流
ffmpeg -i "rtmp://192.168.10.103:1935/live/111 live=1" -acodec copy -vcodec copy -f flv -y test.flv
將rtmp流,以文件的形勢保存到本地
九、音視頻合成
ffmpeg -i test.mp3 -i test1.mp3 -filter_complex amix=inputs=2 -f mp3 c.mp3 #合併二個音頻
ffmpeg -i test.mp3 -i test1.mp3 -filter_complex amix=inputs=2:duration=first:dropout_transition=2 -f mp3 a.mp3
合併二個音頻,以第一個音頻的時長爲新音頻時長
a.txt 格式以下
file '/path/to/file1'
file '/path/to/file2'
file '/path/to/file3'
視頻合成
ffmpeg -f concat -i a.txt -c copy a.flv
ffmpeg -i "concat:1.flv|2.flv|3.flv" -c copy 4.flv
ffmpeg -f concat -i <(for i in {1..4}; do printf "file '%s'\n" input.mp4; done) -c copy output.mp4
Also see:
下面是一些其餘選項
loop filter
Example using the loop filter to loop 4 times, each loop is 75 frames, each loop skips the first 25 frames of the input:
ffmpeg -i input -filter_complex loop=loop=3:size=75:start=25 output
- Or use the shorthand:
loop=3:75:25
- Filtering requires re-encoding.
- This filter places all frames into memory.
- Using
loop=3
will loop 4 times.
- To loop infinitely use
-1
.
- You must list the number of frames to loop (shown as 75 in the example above). Max value is 32767.
- Also see
ffmpeg -h filter=loop
.
-loop
option
The -loop
option is specific to the image file demuxer and gif muxer, so it can't be used for typical video files, but it can be used to infinitely loop a series of input images. This example will loop over and over but the -t 30
will limit the output duration to 30 seconds:
ffmpeg -loop 1 -i %03d.png -t 30 output.mkv
Or to loop a GIF output:
ffmpeg -i input -loop 3 output.
十、視頻推流
nohup ffmpeg -stream_loop -1 -re -i 7189189.mp4 -vcodec copy -acodec copy \
strict -1 -f flv rtmp://push.test.com/db/gw2 > b.txt 2>&1 &
參考文章:
https://video.stackexchange.com/questions/12905/repeat-loop-input-video-with-ffmpeg
https://stackoverflow.com/questions/30846719/infinite-stream-from-a-video-file-in-a-loop
http://www.javashuo.com/article/p-odfxjiak-et.html
http://www.mikewootc.com/wiki/sw_develop/multimedia/ffmpeg_app_param.html