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,等等。
- 類似地,文件內的流被它們的索引引用。
主要參數:
-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
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