FFmpeg命令列
阿新 • • 發佈:2018-12-25
FFmpeg命令列
記錄一下常用的命令列
介紹
基礎語法與流程
ffmpeg [gl-opt] {[input-file-opt] -i input-url} ... {[output-file-opt] output-url} ...
其中, -i
表示輸入引數.
主要引數
下表中:
- 以
<>
包裹的表示由使用者具體指定;以[]
包裹的表示是可選引數,可以指定也可以省略。 - 括號內的
i
表示該引數用於輸入流,o
表示用於輸出流,i/o
表示均可,global
表示全域性引數。 - 關鍵字
duration
,position
offset
滿足:[-][HH:]MM:SS[.m...]
這種時間戳格式。或者以秒為單位的SS[.m...]
格式。
常用的如下:
-b[:stream_specifier] (o)
:輸出位元率。-f <fmt> (i/o)
:指定fmt
作為輸入或輸出的視訊格式。一般會根據副檔名自動選擇,但有時需要手動指定。-i <filename> (i)
:指定filename
作為原始檔。-y (global)
:檔案存在時直接覆蓋。-n (global)
:檔案存在時不覆蓋並立即退出。-bsf[:stream_specifier] <bitstream_filters> (o)
bitstream_filters
是一個逗號分隔的濾鏡列表。-stream_loop <num> (i)
:指定輸入流的迴圈次數。0 表示不迴圈,-1 表示無限迴圈。-c[:stream_specifier] <codec> (i/o)
:-c
可寫為-codec
。選擇一個codec
,即編碼器(輸出時)或一個解碼器(輸入時),參與到stream_specifier
指定的一個或多個流的編碼/解碼中。在輸出時,<codec>
可以被指定為copy
,表示複製資料流。-t <duration> (i/o)
:(在引數-i
duration
時長。一般用於指定剪輯資料流的範圍。 它與-to
引數相互衝突,但本引數優先。-to <position> (o)
:到position
位置後,終止輸出。與-t
引數衝突,本引數優先順序低。-fs <limit_size> (o)
:輸出檔案大小達到limit_size
後停止輸出,單位是 byte.-ss <position> (i/o)
:(在引數-i
之前指定)從position
指定的位置開始工作。注意:大多數情形下,工作起始位置是不精確的。ffmpeg會找到其前部的一個點作為真正的起始,並在結束工作後將該點與使用者指定點之間的內容拋棄。然而,如果你使用了 copy 引數,這部分內容卻會被保留。-sseof <position> (i/o)
:類似-ss
引數,只不過是從資料流末端向前尋找position
。此時 0 表示資料流末。-itsoffset <offset> (i)
:指定輸入流以原時間戳加上offset
作為其輸入時間戳。-metadata[:metadata_specifier] key=value (o)
:以鍵值對的形式設定元資料。-frames[:stream_specifier] <num> (o)
:在輸出num
幀後停止寫入。-qscale[:stream_specifier] q (o)
:使用固定質量(VBR)。stats (global)
:輸出編碼過程,是系統預設值。可以使用-nostats
關閉。-attach <filename> (o)
:將filename
檔案附加到輸出檔案。附件流作為檔案的最後一個流,只有很少的檔案型別被支援(例如字型)。
視訊引數
-vframes <num>
:檔案的總幀數。-frames:v
的別名。-r[:steam_specifier] <fps> (i/o)
:檔案的幀率。-s[:steam_specifier] <size> (i/o)
:幀尺寸。引數size
需要滿足格式<width>x<height>
,例如320x240
。 -aspect[:steam_specifier] <asp> (o)
:寬高比,例如4:3
。如果使用了-vcodec copy
,那麼指定容器的寬高比而不是視訊的。-vn (o)
:禁止輸出視訊。-vcodec <codec> (o)
:設定視訊編碼器。-codec:v
的別名。
音訊引數
-aframes <num> (o)
:檔案的總幀數。-frames:a
的別名。-ar[:stream_specifier] <freq> (i/o)
:取樣率。預設輸出等於輸入。僅當輸入檔案為真實裝置或者 raw 資料時,該引數才能用於輸入過程。-aq <q> (o)
:音訊品質(VBR)。-q:a
的別名。-ac[:stream_specifier] <channel> (i/o)
:設定音訊通道數。預設輸出等於輸入。僅當輸入檔案為真實裝置或者 raw 資料時,該引數才能用於輸入過程。-an (o)
:禁止輸出音訊。-acode <codec> (i/o)
:設定音訊的解碼器或編碼器。-codec:a
的別名。
其他引數
以下直接在 ffmpeg
後使用,例如:ffmpeg -version
-bsfs
:可用的位元流濾鏡。-h [arg]
:幫助。arg 的內容可以是:decoders
:可用的解碼器。或特指:decoder=。encoders
:可用的編碼器。或特指:encoder=。filters
:所有濾鏡。或特指:filter=。formats
:可用的分流器與混流器。或特指分流器:demuxer=,或特指混流器:muxer=。-protocols
:支援的協議。-version
:版本資訊。
示例
編碼
1. yuv -> h265
ffmpeg -s 3840x1920 -pix_fmt yuv420p -r 30 -i basketball_3840x1920.yuv -vframes 300 -c:v libx265 basketball.h265
2. yuv - > h265 全I幀編碼
ffmpeg -s 3840x1920 -pix_fmt yuv420p -r 30 -i basketball_3840x1920.yuv -vframes 300 -c:v libx265 -x265-params keyint=1:ref=1:no-open-gop=1:weightp=0:weightb=0:cutree=0:rc-lookahead=0:bframes=0:scenecut=0:b-adapt=0:repeat-headers=1 -y basketball_3840x1920.h265
3. yuv -> h265 IPPP編碼
- 待續
解碼
1. MP4 -> h265
ffmpeg -i shark.MP4 -s 3840x1920 -vcodec libx265 -y TestStream1_ViewPoint1.h265
2.MP4 -> yuv
ffmpeg -i basketball.MP4 -s 3840x1920 -y -pix_fmt yuv420p basketball_3840x1920.yuv
擷取 / 上下采樣
1. 切取YUV某個區域
ffmpeg.exe -s 3840x1920 -r 30 -pix_fmt yuv420p -i AerialCityStr_3840x1920.yuv -vf crop=1280:320:0:0 -qscale 1 -s 320x320 -sws_flags lanczos -vframes 100 -r 30 enc_AerialCityStr_Tile_0.yuv -y
/*
引數:
源寬x源高 源幀率 源YUV為420 YUV源
切割小塊的寬:高:在源中左上角的座標x: 左上角座標y
輸出長寬
插值方法
幀數
輸出幀率
輸出路徑
*/
2. 下采樣
for 迴圈對YUV下采樣,並264編碼
set bitrate=(200,500,800,1500,3000)
set bitrate2=(200,500,800,1500,3000)
set target_resolution=720x360
set width=720
set height=360
rem 對檔名在filename1中30fps的檔案YUV進行取樣至目標解析度
for %%a in %file_name1% do (for %%b in %bitrate% do (
if not exist %yuv_out%\%%a_sample_%target_resolution%.yuv (ffmpeg -s %initial_resolution% -i %yuv_in%\%%a.yuv -s %target_resolution% %yuv_out%\%%a_sample_%target_resolution%.yuv)
x264.exe -I 30 -i 30 --ref 1 --qpstep 2 --profile baseline --bitrate %%b --vbv-maxrate %%b --vbv-bufsize %%b --vbv-init 0.9 -m 1 --threads 1 --fps %fps1% -o %yuv_out%\%%a_%target_resolution%_%%brat_%fps1%fr.264 %yuv_out%\%%a_sample_%target_resolution%.yuv --input-res %target_resolution% ))
::del %yuv_out%\*.264
::del %yuv_out%\*.yuv