FFmpeg命令行,从小白入门到收藏吃灰——基础归纳

1、查看版本号和功能支持

到官网 http://ffmpeg.org/download.html 下载已经编译好的ffmpeg,选用的是Windows环境下。的BtbN/FFmpeg-Builds/Auto-Build 2020-10-31的版本。

F:\zzr_work_folder\ffmpeg-n4.3.1-lgpl-shared\bin>ffmpeg -version     //解压目录下
ffmpeg version n4.3.1-22-gc464b5c205 Copyright (c) 2000-2020 the FFmpeg developers
built with gcc 9.3-win32 (GCC) 20200320
configuration: --prefix=/ffbuild/prefix --pkg-config-flags=--static --pkg-config=pkg-config --cross-prefix=x86_64-w64-mingw32- --arch=x86_64 --target-os=mingw32
 --enable-version3 --disable-debug --enable-shared --disable-static --disable-debug --enable-iconv --enable-zlib --enable-libxml2 --enable-libfreetype --enable-libfribidi
--enable-gmp --enable-lzma --enable-fontconfig --enable-opencl --enable-libvmaf --disable-vulkan --enable-libvorbis --enable-amf --enable-libaom --disable-avisynth
--enable-libdav1d --disable-libdavs2 --enable-ffnvcodec --enable-cuda-llvm --disable-libglslang --enable-libass --enable-libbluray --enable-libmp3lame
--enable-libopus --enable-libtheora --enable-libvpx --enable-libwebp --enable-libmfx --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg
--enable-librav1e --disable-librubberband --enable-schannel --enable-sdl2 --enable-libsoxr --enable-libsrt --enable-libtwolame --disable-libvidstab --disable-libx264
--disable-libx265 --disable-libxavs2 --disable-libxvid --enable-libzimg --extra-cflags=-DLIBTWOLAME_STATIC --extra-cxxflags= --extra-ldflags=-pthread --extra-libs=-lgomp
libavutil      56. 51.100 / 56. 51.100
libavcodec     58. 91.100 / 58. 91.100
libavformat    58. 45.100 / 58. 45.100
libavdevice    58. 10.100 / 58. 10.100
libavfilter     7. 85.100 /  7. 85.100

这个命令行除了查询当前使用的版本号以外,其实可以查询到当前ffmpeg支持的各种功能项。 以上红色标记处可以看到几个我关注的信息。可以看到x264和x265都是disable的,所以就是为什么有些很紧急的同学就问,为啥命令行分离不出264/265的码流,就是因为所使用的ffmpeg都不支持,怎么搞?

所有我们需要的版本要如何下载?以Windows为例,到官网 http://ffmpeg.org/download.html 选用Windows builds from gyan.dev跳转到https://www.gyan.dev/ffmpeg/builds/,然后下拉到release标签下选择ffmpeg-release-full-shared.7z,如下图所示,然后再试试ffmpeg -version吧骚年。

2、FFmpeg命令行基础选项

先来一组命令行示例,说说基础参数。

F:\zzr_work_folder\ffmpeg-4.3.1-2020-11-19-full_build-shared\bin>
ffmpeg   -ss 10  -i ..\test\guide.mp4 (红色为输入参数) -t 10    -vcodec copy -acodec copy  -f flv   -y   ..\test\guide_copy.flv  (蓝色为输出参数)

1、-f  format(封装格式,mp4/flv/rmvb ...)指定输入或者输出文件格式。常规可省略而使用依据扩展名(文件的前几百K的内容,智能分析)的自动指定,但一些选项需要强制明确设定,个人建议在输出文件前还是写上,增加效率。

2、-i filename (input) 指定输入文件,字面意思,不作解释。

3、-y (global)默认自动覆盖输出文件,而不再询问确认。

4、-n (global)不覆盖输出文件,如果输出文件已经存在则立即退出。

5、-t duration (input/output)限制输入/输出的时间。如果是在-i 前面,就是限定从输入文件中读取多少时间的数据;如果是用于限定输出文件,则表示写入多少时间数据后就停止。duration可以是以秒为单位的数值或者hh:mmss[xxx]格式的时间值。

6、-to position (output)只写入position 时间后就停止,position 可以是以秒为单位的数值或者hh:mm:ss[xxx]格式的时间值,譬如只输出前1分钟的视频,就可以在输出参数增加-to 60 / -to 00:01:00 注意 -to 和-t是互斥的,-t有更高优先级。-t是指整个内容的时长,而-to是指具体的时间点。

7、-ss position (input/output)当在-i 前,表示定位输入文件到position指定的位置。注意可能一些格式是不支持精确定位的,所以ffmpeg可能是定位到最接近position (在之前)的可定位点。position 可以
是以秒为单位的数值或者hh:mm:ss[xxx] 格式的时间值。

8、-[v/a/s]codec[:stream_ specifier]   (input/output,per-stream)为特定的文件选择编/解码模式,对于输出文件就是编码器,对于输入或者某个流就是解码器。
-vcodec代表的是视频编解码器,-acodec代表音频,-scodec代表是字幕。也可以写-codec:a, -codec:v, -codec:s 还可以写 -c:a, -c:v, -c:s 。如果只有-c则是针对源文件中所有流,后面加入copy参数用于复制源文件中的相关流。选项参数中[:stream_ specifier] 指定的是编解码器的名字,或者是copy(仅对输出文件)则意味着流数据直接复制而不再重新转换编码方式。譬如 -vcodec x265 指定的是以265的编码格式进行输出(--enable-libx265才能支持)下文进行详细描述。

3、常用视频指令归纳

F:\zzr_work_folder\ffmpeg-4.3.1-2020-11-19-full_build-shared\bin>

ffmpeg -i ..\test-file\720_h264.mp4(红色为输入参数) -vcodec libx265   -r 25 -s 1280*960   -aspect 1.333333   -f mp4 -y ..\test-file\720_h265.mp4(蓝色为输出参数)

1、-vframes number (output)设置输出文件的帧数,是 -frames:v的别名。(但需要注意的是,这个是截取多少输出帧的数量,并不是控制fps)
2、-b bitrate (output)设置比特率,缺省200kb/s
2、-r[:stream_specifier] fps (input/output,per-stream)设置帧率。(一种H值,缩写或者分数值,这个才是我们常用的改变视频的fps)
3、-s[:stream_specifier] size (input/output,per-stream)设置帧的尺寸。(字面意思,缩放尺寸大小)
4、-vn (output)禁止输出视频。N:no(当想只要音频,不要视频的时候,使用此指令)
5、-vcodec codec (output)设置视频编码器,这是 -codec:v的一个别名。-vcodec代表的是视频编解码器,-acodec代表音频,-scodec代表是字幕。也可以写-codec:a, -codec:v, -codec:s 还可以写 -c:a, -c:v, -c:s 。如果只有-c则是针对源文件中所有流,后面加入copy参数用于复制源文件中的相关流。
6、-aspect[:stream_specifier] aspect (output,per-stream)指定视频的纵横比(长宽显示比例)。aspect是一个浮点数字符串或者num:den格式字符串(其值就是num/den),例如"4:3" ,"16:9" ,"1.3333"以及"1.7777"都是常用参数值。要结合(-s)指令一起使用。

4、常用音频指令归纳

F:\zzr_work_folder\ffmpeg-4.3.1-2020-11-19-full_build-shared\bin>

ffmpeg -i ..\test-file\bg.mp3(红色为输入参数) -vn -aframes 200 -acodec libmp3lame -ac 2 -ar 48000 -y ..\test-file\bgc.mp3(蓝色为输出参数)

1、-aframes number (output)设置number音频帧输出,是-frames:a的别名。(注意,这个和-vframes是一样的,就是截取多少输出帧的额数量,并不是采样率)
2、-ar[:stream_specifier] freq (input/output,per-stream)设置音频采样率。默认是输出同于输入。对于输入进行设置,仅仅通道是真实的设备或者raw数据分离出并映射的通道才有效。对于输出则可以强制设置音频量化的采用率。
3、-aq q (output)设置音频品质(编码指定为VBR),它是-q:a 的别名。一些常用的音频品质参数:
quality settings (VBR)      -aq 4 = 128 kb/s      -aq 5 = 160 kb/s      -aq 6 = 192 kb/s      -aq 7 = 224 kb/s      -aq 8= 256 kb/s
4、-ac[:stream_specifier] channels (input/output,per-stream)设置音频通道数。默认输出会有输入相同的音频通道。对于输入进行设置,仅仅通道是真实的设备或者raw数据分离出并映射的通道才有效。
5、-an (output)禁止输出音频。
6、-acode codec (input/output)设置音频解码/编码的编/解码器,是-codec:a 的别名。-vcodec代表的是视频编解码器,-acodec代表音频,-scodec代表是字幕。也可以写-codec:a, -codec:v, -codec:s 还可以写 -c:a, -c:v, -c:s 。如果只有-c则是针对源文件中所有流,后面加入copy参数用于复制源文件中的相关流。

5、字幕指令归纳

F:\zzr_work_folder\ffmpeg-4.3.1-2020-11-19-full_build-shared\bin>
ffmpeg -i ..\test-file\test.mp4 -vf subtitles=012.srt -y output1001.mp4 

1、-scodec codec (input/output)设置字幕解码器,是-codec:s的别名。-vcodec代表的是视频编解码器,-acodec代表音频,-scodec代表是字幕。也可以写-codec:a, -codec:v, -codec:s 还可以写 -c:a, -c:v, -c:s 。如果只有-c则是针对源文件中所有流,后面加入copy参数用于复制源文件中的相关流。
2、-sn (output)禁止输出字幕。
3、-s: subtitle:输入字幕 
4、-vf参数,即videofilter,调用libavfilter中的函数,这样字幕流就相当于覆盖在视频流中,变成原视频流中的像素点,最后output的文件是没有字幕流的。即已把字幕像素点渲染到视频当中。


字幕格式种类:srt,ass,ssa 。。。
字幕格式转换:srt--->ass
ffmpeg -i 012.srt 012.ass

视频混入字幕流
ffmpeg -i test.mp4 -i 012.ass -c copy  -y output1002.mkv

6、 ffprobe的基础命令

在FFmpeg套件中,除了ffmpeg还有ffprobe, ffprobe 主要用来查看多媒体文件的信息,下面看一下ffprobe 中常见的基本命令.

1、ffprobe -show_ packets ..\test\guide.mp4 (输入命令之后会不断打印输入文件的所有解封装AVPacket,可以用ctrl+c暂停输出)

查看的多媒体包信息使用PACKET标签所包括起来,就是ffmpeg解封装后没解压的数据格式AVPacket,其中包含的信息主要如下:

[PACKET]
codec_type=video(多媒体类型,例如视频包,音频包等;)
stream_index=0(多媒体的stream索引;)
pts=0(多媒体的显示时间值//presentation timestamp)
pts_time=0.000000(根据不同格式计算过后的多媒体的显示时间)
dts=-2048(多媒体解码时间值//decoding timestamp)
dts_time=-0.200000(根据不同格式计算过后的多媒体解码时间)
duration=1024(多媒体包占用的时间值)
duration_time=0.100000(根据不同格式计算过后的多媒体包占用的时间值)
convergence_duration=N/A
convergence_duration_time=N/A
size=150517(多媒体包的大小)
pos=48(多媒体包所在的文件偏移位置)
flags=K_(多媒体包标记,关键包与非关键包的标记)
[/PACKET]

2、ffprobe -show_format ..\test\guide.mp4

除了packets与data外,ffprobe还可以分析多媒体的封装格式,通过show_format参数可以查看多媒体的封装格式,封装可是使用FORMAT标签括起来显示:

[FORMAT]
filename=..\test\guide.mp4
nb_streams=1
nb_programs=0
format_name=mov,mp4,m4a,3gp,3g2,mj2
format_long_name=QuickTime / MOV
start_time=0.000000
duration=53.200000
size=2764668
bit_rate=415739
probe_score=100
TAG:major_brand=isom
TAG:minor_version=512
TAG:compatible_brands=isomiso2avc1mp41
TAG:encoder=Lavf58.12.100
[/FORMAT]

通过读取format信息,可以看到这个视频文件只有一个流通道,起始时间是0.00000,长度为85.867000,文件大小为2377700字节,码率为221523字节每秒,这个文件有可能是一个mov、有可能是mp4、有可能是m4a、有可能是3gp、有可能是3g2、也有可能是mj2,之所以ffprobe会这么输出,是因为这几种封装格式在ffmpeg中所识别的标签基本相同,所以才会这么多种显示方式,而其他种封装格式不一定是这样的

3、ffprobe -show_frames ..\test\guide.mp4 (输入命令之后会不断打印输入文件的所有解码对象AVFrame,可以用ctrl+c暂停输出)

通过ffprobe的show_frames的参数可以查看视频文件中的帧信息,输出的帧信息使用FRAME标签括起来:

[FRAME]
media_type=video (帧类型)
stream_index=0(帧所在索引区域)
key_frame=1(是否关键帧)
pkt_pts=0(frame包的pts)
pkt_pts_time=0.000000(frame包的pts的时间显示)
pkt_dts=0(frame包的dts)
pkt_dts_time=0.000000(frame包的dts的时间显示)
best_effort_timestamp=0
best_effort_timestamp_time=0.000000
pkt_duration=1024(frame包的时长)
pkt_duration_time=0.100000(frame包的时长时间显示)
pkt_pos=48(frame包所在文件的偏移位置)
pkt_size=150517(frame包的大小)
width=1280(帧显示宽度)
height=720(帧显示高度)
pix_fmt=yuv420p(帧图像格式)
sample_aspect_ratio=N/A(采样比率)
pict_type=I(帧图像类型)
coded_picture_number=0
display_picture_number=0
interlaced_frame=0
top_field_first=0
repeat_pict=0
color_range=unknown
color_space=unknown
color_primaries=unknown
color_transfer=unknown
chroma_location=left
[/FRAME]

4、ffprobe -show_streams ..\test\guide.mp4

通过-show_ streams 参数可以查看到多媒体文件中的流信息,流的信息使用STREAMS标签括起来:

[STREAM]
index=0(流所在的索引区域)
codec_name=h264(编码格式名字)
codec_long_name=H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10(编码格式全名)
profile=High(编码的profile)
codec_type=video(编码类型)
codec_time_base=1/20(编码的时间戳计算的时间基)
codec_tag_string=avc1(编码标签类型)
codec_tag=0x31637661(编码标签数据)
width=1280(设置编码宽)
height=720(设置编码高)
coded_width=1280(编码后的宽)
coded_height=720(编码后的高)
closed_captions=0
has_b_frames=2(包含b帧)
sample_aspect_ratio=N/A
display_aspect_ratio=N/A
pix_fmt=yuv420p(图像格式)
level=31(编码等级)
color_range=unknown
color_space=unknown
color_transfer=unknown
color_primaries=unknown
chroma_location=left
field_order=unknown
timecode=N/A
refs=1
is_avc=true
nal_length_size=4
id=N/A
r_frame_rate=10/1
avg_frame_rate=10/1
time_base=1/10240
start_pts=0
start_time=0.000000
duration_ts=544768
duration=53.200000
bit_rate=414656
max_bit_rate=N/A
bits_per_raw_sample=8
nb_frames=532
nb_read_frames=N/A
nb_read_packets=N/A
DISPOSITION:default=1
DISPOSITION:dub=0
DISPOSITION:original=0
DISPOSITION:comment=0
DISPOSITION:lyrics=0
DISPOSITION:karaoke=0
DISPOSITION:forced=0
DISPOSITION:hearing_impaired=0
DISPOSITION:visual_impaired=0
DISPOSITION:clean_effects=0
DISPOSITION:attached_pic=0
DISPOSITION:timed_thumbnails=0
TAG:language=eng
TAG:handler_name=VideoHandler
[/STREAM]

5、ffprobe -show_ frames -select_ streams v -of xml ..\test\guide.mp4

select_ streams;如果只查看音频流或视频流,使用select_streams参数即可,例如只查看视频流的frames信息;

6、ffprobe -show_frames ..\test\guide.mp4 -print_ format json

ffprobe使用前面的参数可以获得到对应的key-value,但是阅读起来因习惯不同所以有的人认为方便,有的人认为不方便,这样就需要用到ffprobe的print__format参数来进行相应的格式输出,支持包括以下格式:xml,json,ini,csv,flat

That is ...

猜你喜欢

转载自blog.csdn.net/a360940265a/article/details/111312178