FFmpeg命令詳解


FFmpeg命令分類

  • 基本信息查詢命令
  • 錄制命令
  • 分解、復用命令
  • 處理原始數據命令
  • 各種濾鏡命令
  • 裁剪與合並命令
  • 圖片、視頻互轉命令
  • 直播相關命令

FFmpeg處理音視頻流程

  • 編碼的數據包傳送給解碼器(除非為數據流選擇了流拷貝)
  • 解碼器產生未壓縮的幀(原始視頻/ PCM音頻/ ...),可以通過濾波進一步處理
  • 在過濾之后,幀被傳遞到編碼器,編碼器並輸出編碼的數據包
  • 最后,這些傳遞給復用器,將編碼的數據包寫入輸出文件

FFmpeg可以使用下面的參數進行基本信息查詢

-version		顯示版本
-formats		顯示可用的格式(包括設備)
-demuxers		顯示可用的demuxers
-muxers			顯示可用的muxers
-devices		顯示可用的設備
-codecs			顯示libavcodec已知的所有編解碼器
-decoders		顯示可用的解碼器
-encoders		顯示所有可用的編碼器
-bsfs			顯示可用的比特流filter
-protocols		顯示可用的協議
-filters		顯示可用的libavfilter過濾器
-pix_fmts		顯示可用的像素格式
-sample_fmts            顯示可用的采樣格式
-layouts		顯示channel名稱和標准channel布局
-colors			顯示識別的顏色名稱

FFmpeg 的基本命令格式

ffmpeg [global_options] {[input_file_options] -i input_url} ...
                         {[output_file_options] output_url} ...
  • ffmpeg 通過 -i 選項讀取輸任意數量的輸入“文件”
    • 可以是常規文件,管道,網絡流,抓取設備等,並寫入任意數量的輸出“文件”。
    • 原則上,每個輸入/輸出“文件”都可以包含任意數量的不同類型的視頻流(視頻/音頻/字幕/附件/數據)。
    • 流的數量和/或類型是由容器格式來限制。
    • 選擇從哪個輸入進入到哪個輸出將自動完成或使用 -map 選項。
  • 要引用選項中的輸入文件,您必須使用它們的索引(從0開始)。
    • 例如:第一個輸入文件是0,第二個輸入文件是1,等等。
  • 類似地,文件內的流被它們的索引引用。
    • 例如:2:3是指第三個輸入文件中的第四個流。

主要參數:

-f fmt(輸入/輸出)	
    強制輸入或輸出文件格式。 
    格式通常是自動檢測輸入文件,並從輸出文件的文件擴展名中猜測出來
    所以在大多數情況下這個選項是不需要的。
-i url(輸入)	
    輸入文件的網址
-y(全局參數)
    覆蓋輸出文件而不詢問。
-n(全局參數)
    不要覆蓋輸出文件,如果指定的輸出文件已經存在,請立即退出。
-c [:stream_specifier] codec(輸入/輸出,每個流)
    選擇一個編碼器(當在輸出文件之前使用)或解碼器(當在輸入文件之前使用時)用於一個或多個流。
    codec 是解碼器/編碼器的名稱或 copy(僅輸出)以指示該流不被重新編碼。
    如:ffmpeg -i INPUT -map 0 -c:v libx264 -c:a copy OUTPUT
-codec [:stream_specifier]編解碼器(輸入/輸出,每個流)	
    同 -c
-t duration(輸入/輸出)
    當用作輸入選項(在-i之前)時,限制從輸入文件讀取的數據的持續時間。
    當用作輸出選項時(在輸出url之前),在持續時間到達持續時間之后停止輸出。
-ss位置(輸入/輸出)
    當用作輸入選項時(在-i之前),在這個輸入文件中尋找位置。 
    請注意,在大多數格式中,不可能精確搜索,因此ffmpeg將在位置之前尋找最近的搜索點。 
    當轉碼和-accurate_seek被啟用時(默認),搜索點和位置之間的這個額外的分段將被解碼和丟棄。 
    當進行流式復制或使用-noaccurate_seek時,它將被保留。
    當用作輸出選項(在輸出url之前)時,解碼但丟棄輸入,直到時間戳到達位置。
-frames [:stream_specifier] framecount(output,per-stream)
    停止在幀計數幀之后寫入流。
-filter [:stream_specifier] filtergraph(output,per-stream)
    創建由filtergraph指定的過濾器圖,並使用它來過濾流。
    filtergraph是應用於流的filtergraph的描述,並且必須具有相同類型的流的單個輸入和單個輸出。
    在過濾器圖形中,輸入與標簽中的標簽相關聯,標簽中的輸出與標簽相關聯。
    有關filtergraph語法的更多信息,請參閱ffmpeg-filters手冊。

視頻參數:

-vframes num(輸出)	
    設置要輸出的視頻幀的數量。
    對於-frames:v,這是一個過時的別名,您應該使用它。
-r [:stream_specifier] fps(輸入/輸出,每個流)
    設置幀率(Hz值,分數或縮寫)。
    作為輸入選項,忽略存儲在文件中的任何時間戳,根據速率生成新的時間戳。
    這與用於-framerate選項不同(它在FFmpeg的舊版本中使用的是相同的)。
    如果有疑問,請使用-framerate而不是輸入選項-r。
    作為輸出選項,復制或丟棄輸入幀以實現恆定輸出幀頻fps。
-s [:stream_specifier]大小(輸入/輸出,每個流)
    設置窗口大小。
    作為輸入選項,這是video_size專用選項的快捷方式,由某些分幀器識別,其幀尺寸未被存儲在文件中。
    作為輸出選項,這會將縮放視頻過濾器插入到相應過濾器圖形的末尾。
    請直接使用比例過濾器將其插入到開頭或其他地方。格式是'wxh'(默認 - 與源相同)。
-aspect [:stream_specifier] 寬高比(輸出,每個流)
    設置方面指定的視頻顯示寬高比。
    aspect可以是浮點數字符串,也可以是num:den形式的字符串,其中num和den是寬高比的分子和分母。
    例如“4:3”,“16:9”,“1.3333”和“1.7777”是有效的參數值。
    如果與-vcodec副本一起使用,則會影響存儲在容器級別的寬高比,
    但不會影響存儲在編碼幀中的寬高比(如果存在)。
-vn(輸出)
    禁用視頻錄制。
-vcodec編解碼器(輸出)
    設置視頻編解碼器。
    這是-codec:v的別名。
-vf filtergraph(輸出)
    創建由filtergraph指定的過濾器圖,並使用它來過濾流。

音頻參數:

-aframes(輸出)
    設置要輸出的音頻幀的數量。
    這是-frames:a的一個過時的別名。
-ar [:stream_specifier] freq(輸入/輸出,每個流)
    設置音頻采樣頻率。
    對於輸出流,它默認設置為相應輸入流的頻率。
    對於輸入流,此選項僅適用於音頻捕獲設備和原始分路器,並映射到相應的分路器選件。
-ac [:stream_specifier]通道(輸入/輸出,每個流)
    設置音頻通道的數量。
    對於輸出流,它默認設置為輸入音頻通道的數量。
    對於輸入流,此選項僅適用於音頻捕獲設備和原始分路器,並映射到相應的分路器選件。
-an(輸出)
    禁用錄音。
-acodec編解碼器(輸入/輸出)
    設置音頻編解碼器。
    這是-codec的別名:a。
-sample_fmt [:stream_specifier] sample_fmt(輸出,每個流)
    設置音頻采樣格式。
    使用-sample_fmts獲取支持的樣本格式列表。
    -af filtergraph(輸出)	
    創建由filtergraph指定的過濾器圖,並使用它來過濾流。

FFmpeg實例

1、列出ffmpeg支持的所有格式

ffmpeg -formats

2、剪切一段媒體文件, 可以是音頻或者視頻文件

ffmpeg -i input.mp4 -ss 00:00:50.0 -codec copy -t 20 output.mp4
  • 表示將文件input.mp4從第50s開始剪切20s的時間,
  • 輸出到文件output.mp4中,
  • 其中 -ss指定偏移時間( time Offset) ,
  • -t指定的時長( duration)

3、如果在手機中錄制了一個時間比較長的視頻無法分享到微信中,那么可以使用ffmpeg將該視頻文件切割為多個文件

ffmpeg -i input.mp4 -t 00:00:50 -c copy small-1.mp4 -ss 00:00:50 -codec copy small-2.mp4

4、使一個視頻中的音頻靜音, 即只保留視頻

ffmpeg -i input.mp4 -an -vcodec copy output.mp4

5、從MP4文件中抽取視頻流導出為裸H264數據

ffmpeg -i output.mp4 -an -vcodec copy -bsf:v h264_mp4toannexb output.h264
  • 視頻數據使用mp4toannexb這個bitstream filter來轉換為原始的H264數據,

6、使用AAC音頻數據和H264的視頻生成MP4文件

ffmpeg -i test.aac -i test.h264 -acodec copy -bsf:a aac_adtstoasc -vcodec copy -f mp4 output.mp4

7、對音頻文件的編碼格式做轉換

ffmpeg -i input.wav -acodec libfdk_aac output.aac

8、從WAV音頻文件中導出PCM裸數據

ffmpeg -i input.wav -acodec pcm_s16le -f s16le output.pcm
  • 這樣就可以導出用16個bit來表示一個sample的PCM數據了,
  • 並且每個sample的字節排列順序都是小尾端表示的格式,
  • 聲道數和采樣率使用的都是原始WAV文件的聲道數和采樣率的PCM數據。

9、重新編碼視頻文件, 復制音頻流, 同時封裝到MP4格式的文件中

ffmpeg -i input.flv -vcodec libx264 -acodec copy output.mp4

10、將一個MP4格式的視頻轉換成為gif格式的動圖

ffmpeg -i input.mp4 -vf scale=100:-1 -t 5 -r 10 image.gif
  • 上述代碼按照分辨比例不動寬度改為100( 使用VideoFilter的scaleFilter) ,
  • 幀率改為10(-r),只處理前5秒鍾(-t)的視頻,生成gif

11、將一個視頻的畫面部分生成圖片

  • 比如要分析一個視頻里面的每一幀都是什么內容的時候, 可能就需要用到這個命令了
ffmpeg -i output.mp4 -r 0.25 frames_%04d.png

12、使用一組圖片可以組成一個gif

  • 如果你連拍了一組照片, 就可以用下面這行命令生成一個gif
ffmpeg -i frames_%04d.png -r 5 output.gif

13、使用音量效果器,可以改變一個音頻媒體文件中的音量

ffmpeg -i input.wav -af ‘volume=0.5’ output.wav
  • 上述命令是將input.wav中的聲音減小一半, 輸出到output.wav文件中,
  • 可以直接播放來聽, 或者放到一些音頻編輯軟件中直接觀看波形幅度的效果

14、淡入效果器的使用

ffmpeg -i input.wav -filter_complex afade=t=in:ss=0:d=5 output.wav
  • 上述命令可以將input.wav文件中的前5s做一個淡入效果, 輸出到output.wav中,
  • 可以將處理之前和處理之后的文件拖到Audacity音頻編輯軟件中查看波形圖

15、淡出效果器的使用

ffmpeg -i input.wav -filter_complex afade=t=out:st=200:d=5 output.wav
  • 上述命令可以將input.wav文件從200s開始, 做5s的淡出效果, 並放到output.wav文件中

16、將兩路聲音進行合並, 比如要給一段聲音加上背景音樂

ffmpeg -i vocal.wav -i accompany.wav -filter_complex amix=inputs=2:duration=shortest output.wav
  • 上述命令是將vocal.wav和accompany.wav兩個文件進行mix,
  • 按照時間長度較短的音頻文件的時間長度作為最終輸出的output.wav的時間長度。

16、對聲音進行變速但不變調效果器的使用

ffmpeg -i vocal.wav -filter_complex atempo=0.5 output.wav
  • 上述命令是將vocal.wav按照0.5倍的速度進行處理生成output.wav,
  • 時間長度將會變為輸入的2倍。 但是音高是不變的, 這就是大家常說的變速不變調

17、為視頻增加水印效果

ffmpeg -i input.mp4 -i changba_icon.png -filter_complex 
    '[0:v][1:v]overlay=main_w-overlay_w-10:10:1[out]' -map '[out]' output.mp4
  • 上述命令包含了幾個內置參數,
  • main_w代表主視頻寬度,
  • overlay_w代表水印寬度,
  • main_h代表主視頻高度,
  • overlay_h代表水印高度

18、視頻提亮效果器的使用

ffmpeg -i input.flv -c:v libx264 -b:v 800k  -c:a libfdk_aac -vf eq=brightness=0.25
        -f mp4 output.mp4
  • 提亮參數是brightness,取值范圍是從-1.0到1.0,默認值是0

19、為視頻增加對比度效果

ffmpeg -i input.flv -c:v libx264 -b:v 800k  -c:a libfdk_aac -vf eq=contrast=1.5 -f mp4 output.mp4
  • 對比度參數是contrast, 取值范圍是從-2.0到2.0, 默認值是1.0

20、視頻旋轉效果器的使用

ffmpeg -i input.mp4 -vf "transpose=1" -b:v 600k output.mp4

21、視頻裁剪效果器的使用

ffmpeg -i input.mp4 -an -vf "crop=240:480:120:0" -vcodec libx264 -b:v 600k output.mp4

22、將一張RGBA格式表示的數據轉換為JPEG格式的圖片

ffmpeg -f rawvideo -pix_fmt rgba -s 480*480 -i texture.rgb 
    -f image2 -vcodec mjpeg output.jpg

23、將一個YUV格式表示的數據轉換為JPEG格式的圖片

ffmpeg -f rawvideo -pix_fmt yuv420p -s 480*480 -i texture.yuv 
    -f image2 -vcodec mjpeg output.jpg

24、將一段視頻推送到流媒體服務器上

ffmpeg -re -i input.mp4 -acodec copy -vcodec copy -f flv rtmp://xxx
  • 上述代碼中, rtmp: //xxx代表流媒體服務器的地址,
  • 加上-re參數代表將實際媒體文件的播放速度作為推流速度進行推送

25、將流媒體服務器上的流dump到本地

ffmpeg -i http://xxx/xxx.flv -acodec copy -vcodec copy -f flv output.flv
  • 上述代碼中, http://xxx/xxx.flv 代表一個可以訪問的視頻網絡地址,
  • 可按照復制視頻流格式和音頻流格式的方式, 將文件下載到本地的output.flv媒體文件中

26、將兩個音頻文件以兩路流的形式封裝到一個文件中,

  • 比如在K歌的應用場景中, 原伴唱實時切換的場景下,
  • 可以使用一個文件包含兩路流, 一路是伴奏流, 另外一路是原唱流
ffmpeg -i 131.mp3 -i 134.mp3 -map 0:a -c:a:0 libfdk_aac -b:a:0 96k -map 1:a -c:a:1
        libfdk_aac -b:a:1 64k -vn -f mp4 output.m4a


免責聲明!

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



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