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