【Linux】關於ffmpeg的一些常見用法


 一、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測試

三、實戰操作

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表示原樣拷貝;

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 -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     
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的圖片  
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.

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 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM