一、FFmpeg簡介
FFmpeg是一款非常快速的視頻和音頻轉換器, 是開源項目 FFmpeg (Fast Forward moving pictures expert group) 的命令行程序。 它可以在任意采樣率之間轉換,並通過高質量的多相濾波器實時調整視頻大小。
FFmpeg程序的轉碼流程,如下所示
_______ ______________ | | | | | input | demuxer | encoded data | decoder | file | ---------> | packets | -----+ |_______| |______________| | v _________ | | | decoded | | frames | |_________| ________ ______________ | | | | | | | output | <-------- | encoded data | <----+ | file | muxer | packets | encoder |________| |______________| 其中, demuxer 為解復用器, muxer 為復用器; decoder 為解碼器, encoder 為編碼器
二、關於FFmpeg的參數
1、通用選項
-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]的格式也支持
2、視頻選項
-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
3、高級視頻選項
-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
4、音頻選項
-ab bitrate 設置音頻碼率 -ar freq 設置音頻采樣率 -ac channels 設置通道 缺省為1 -an 不使能音頻紀錄 -acodec codec 使用codec編解碼
5、音頻/視頻捕獲選項
-vd device 設置視頻捕獲設備。比如/dev/video0 -vc channel 設置視頻捕獲通道 DV1394專用 -tvstd standard 設置電視標准 NTSC PAL(SECAM) -dv1394 設置DV1394捕獲 -av device 設置音頻設備 比如/dev/dsp
6、高級選項
-map file:stream 設置輸入流映射 -debug 打印特定調試信息 -benchmark 為基准測試加入時間 -hex 傾倒每一個輸入包 -bitexact 僅使用位精確算法 用於編解碼測試 -ps size 設置包大小,以bits為單位 -re 以本地幀頻讀數據,主要用於模擬捕獲設備 -loop 循環輸入流。只工作於圖像流,用於ffserver測試
三、實戰操作
1、測試轉碼
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 文件已經存在的話,不經提示就覆蓋掉
-
-i "1.avi" 輸入文件是和ffmpeg在同一目錄下的1.avi文件,可以自己加路徑,改名字
-
-title "Test" 在PSP中顯示的影片的標題
-
-vcodec xvid 使用XVID編碼壓縮視頻,不能改的
-
-s 368x208 輸出的分辨率為368x208,注意片源一定要是16:9的不然會變形
-
-r 29.97 幀數,一般就用這個吧
-
-b 1500 視頻數據流量,用-b xxxx的指令則使用固定碼率,數字隨便改,1500以上沒效果;還可以用動態碼率如:-qscale 4和-qscale 6,4的質量比6高
-
-acodec aac 音頻編碼用AAC
-
-ac 2 聲道數1或2
-
-ar 24000 聲音的采樣頻率,好像PSP只能支持24000Hz
-
-ab 128 音頻數據流量,一般選擇32、64、96、128
-
-vol 200 200%的音量,自己改
-
-muxvb 768 好像是給PSP機器識別的碼率,一般選擇384、512和768,我改成1500,PSP就說文件損壞了
-
-f psp 輸出psp專用格式
-
"output.wmv" 輸出文件名,也可以加路徑改文件名
2、視頻裁剪
將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表示原樣拷貝;
3、視頻截圖
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
在第三秒的時候,截圖
4、獲取視頻時長
5、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
6、視頻加水印
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
7、生成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的圖片
8、下載RTMP流
ffmpeg -i "rtmp://192.168.10.103:1935/live/111 live=1" -acodec copy -vcodec copy -f flv -y test.flv
將rtmp流,以文件的形勢保存到本地
9、音視頻合成
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.
10、視頻推流
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
https://www.cnblogs.com/jhj117/p/9130073.html
http://www.mikewootc.com/wiki/sw_develop/multimedia/ffmpeg_app_param.html