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

 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" 輸出文件名,也能夠加路徑改文件名

二、視頻裁剪

將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.

十、視頻推流

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 

相關文章
相關標籤/搜索