前言
FFmpeg 有三个作用不同的工具软件 ffmpeg.exe
,ffplay.exe
,ffprobe.exe
,本文主要讲讲这些工具软件的使用方法。
一、ffmpeg 常用命令
ffmpeg 在做音视频编解码时非常方便,所以很多场景下转码使用的是 ffmpeg,通过 ffmpeg -help
命令操作可以看到 ffmpeg 常见的命令大概分为六部分:
- ffmpeg 信息查询部分
- 公共操作参数部分
- 文件主要操作参数部分
- 视频操作参数部分
- 音频操作参数部分
- 字幕操作参数部分
D:\Work\test>ffmpeg -help ffmpeg version 6.0-essentials_build-www.gyan.dev Copyright (c) 2000-2023 the FFmpeg developers built with gcc 12.2.0 (Rev10, Built by MSYS2 project) configuration: --enable-gpl --enable-version3 --enable-static --disable-w32threads --disable-autodetect --enable-fontconfig --enable-iconv --enable-gnutls --enable-libxml2 --enable-gmp --enable-bzlib --enable-lzma --enable-zlib --enable-libsrt --enable-libssh --enable-libzmq --enable-avisynth --enable-sdl2 --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxvid --enable-libaom --enable-libopenjpeg --enable-libvpx --enable-mediafoundation --enable-libass --enable-libfreetype --enable-libfribidi --enable-libvidstab --enable-libvmaf --enable-libzimg --enable-amf --enable-cuda-llvm --enable-cuvid --enable-ffnvcodec --enable-nvdec --enable-nvenc --enable-d3d11va --enable-dxva2 --enable-libvpl --enable-libgme --enable-libopenmpt --enable-libopencore-amrwb --enable-libmp3lame --enable-libtheora --enable-libvo-amrwbenc --enable-libgsm --enable-libopencore-amrnb --enable-libopus --enable-libspeex --enable-libvorbis --enable-librubberband libavutil 58. 2.100 / 58. 2.100 libavcodec 60. 3.100 / 60. 3.100 libavformat 60. 3.100 / 60. 3.100 libavdevice 60. 1.100 / 60. 1.100 libavfilter 9. 3.100 / 9. 3.100 libswscale 7. 1.100 / 7. 1.100 libswresample 4. 10.100 / 4. 10.100 libpostproc 57. 1.100 / 57. 1.100 Hyper fast Audio and Video encoder usage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}... Getting help: -h -- print basic options -h long -- print more options -h full -- print all options (including all format and codec specific options, very long) -h type=name -- print all options for the named decoder/encoder/demuxer/muxer/filter/bsf/protocol See man ffmpeg for detailed description of the options. Print help / information / capabilities: -L show license -h topic show help -? topic show help -help topic show help --help topic show help -version show version -buildconf show build configuration -formats show available formats -muxers show available muxers -demuxers show available demuxers -devices show available devices -codecs show available codecs -decoders show available decoders -encoders show available encoders -bsfs show available bit stream filters -protocols show available protocols -filters show available filters -pix_fmts show available pixel formats -layouts show standard channel layouts -sample_fmts show available audio sample formats -dispositions show available stream dispositions -colors show available color names -sources device list sources of the input device -sinks device list sinks of the output device -hwaccels show available HW acceleration methods Global options (affect whole program instead of just one file): -loglevel loglevel set logging level -v loglevel set logging level -report generate a report -max_alloc bytes set maximum size of a single allocated block -y overwrite output files -n never overwrite output files -ignore_unknown Ignore unknown stream types -filter_threads number of non-complex filter threads -filter_complex_threads number of threads for -filter_complex -stats print progress report during encoding -max_error_rate maximum error rate ratio of decoding errors (0.0: no errors, 1.0: 100% errors) above which ffmpeg returns an error instead of success. Per-file main options: -f fmt force format -c codec codec name -codec codec codec name -pre preset preset name -map_metadata outfile[,metadata]:infile[,metadata] set metadata information of outfile from infile -t duration record or transcode "duration" seconds of audio/video -to time_stop record or transcode stop time -fs limit_size set the limit file size in bytes -ss time_off set the start time offset -sseof time_off set the start time offset relative to EOF -seek_timestamp enable/disable seeking by timestamp with -ss -timestamp time set the recording timestamp ('now' to set the current time) -metadata string=string add metadata -program title=string:st=number... add program with specified streams -target type specify target file type ("vcd", "svcd", "dvd", "dv" or "dv50" with optional prefixes "pal-", "ntsc-" or "film-") -apad audio pad -frames number set the number of frames to output -filter filter_graph set stream filtergraph -filter_script filename read stream filtergraph description from a file -reinit_filter reinit filtergraph on input parameter changes -discard discard -disposition disposition Video options: -vframes number set the number of video frames to output -r rate set frame rate (Hz value, fraction or abbreviation) -fpsmax rate set max frame rate (Hz value, fraction or abbreviation) -s size set frame size (WxH or abbreviation) -aspect aspect set aspect ratio (4:3, 16:9 or 1.3333, 1.7777) -display_rotation angle set pure counter-clockwise rotation in degrees for stream(s) -display_hflip set display horizontal flip for stream(s) (overrides any display rotation if it is not set) -display_vflip set display vertical flip for stream(s) (overrides any display rotation if it is not set) -vn disable video -vcodec codec force video codec ('copy' to copy stream) -timecode hh:mm:ss[:;.]ff set initial TimeCode value. -pass n select the pass number (1 to 3) -vf filter_graph set video filters -b bitrate video bitrate (please use -b:v) -dn disable data Audio options: -aframes number set the number of audio frames to output -aq quality set audio quality (codec-specific) -ar rate set audio sampling rate (in Hz) -ac channels set number of audio channels -an disable audio -acodec codec force audio codec ('copy' to copy stream) -ab bitrate audio bitrate (please use -b:a) -af filter_graph set audio filters Subtitle options: -s size set frame size (WxH or abbreviation) -sn disable subtitle -scodec codec force subtitle codec ('copy' to copy stream) -stag fourcc/tag force subtitle tag/fourcc -fix_sub_duration fix subtitles duration -canvas_size size set canvas size (WxH or abbreviation) -spre preset set the subtitle options to the indicated preset
ffmpeg 信息查询部分主要参数:
其中通过 ffmpeg --help 查看到的 help 信息是基础的信息,如果想获得高级参数部分,可以通过使用 ffmpeg --help long 参数来查看,如果希望获得全部的帮助信息,可以同过使用 ffmpeg --help full 参数来获得。
通过 -L
参数,可以看到 ffmpeg 目前所支持的 license 协议,通过 -version
查看 ffmpeg 的版本,这里所查看的版本, 是详细的版本,包含 libavformat
、libavcodec
、libavutil
、libavfilter
、libswscale
、libswresample
的版本。
有时候使用 ffmpeg 转码,发现无法解析视频文件,或者无法生成视频文件,报一些不支持生成对应的视频文件的错误,这个时候就需要查看当前使用的 ffmpeg 是否支对应的视频文件格式,需要使用 ffmpeg -formats
来查看。
封装格式/解封装格式如下图:
注:因列表比较长,因此只截取一部分
在上面输出的内容中,分为三部门:
- 第一列是多媒体文件格式的 Demuxing 支持与 Muxing 支持;
- 第二列是多媒体文件格式;
- 第三列是文件格式的详细说明。
1、ffmpeg 的封装转换
- Avformat
- Avcodec
- Avutil
FFmpeg 的封装转换部分,主要是通过 libavformat 这部分来完成的功能,通过 libavformat 库进行 mux 和 demux 操作,多媒体文件的格式有很多种,但是还是有好多 demux 与 mux 的操作参数是公用的,下面来详细介绍一下这些公用的参数:
avioflags
:format 的缓冲设置,默认为 0,就是有缓冲;direct
:无缓冲状态;probesize
:获得文件内容的大小;formatprobesiz
:设置一个获得文件内容的大小来解析文件的 format;fflags
: 设置读取或者写出的格式的形式的标签,分为多种方式:flush_packets,ignidx,genpts,nofillin,noparse,igndts,discardcorrupt,sortdts,keepside,fastseek,latm,nobuffer,bitexact
下面针对这些 format 读写方式进行一一详解:
AVPacket(压缩的 h264/aac),AVFrame(原始未压缩:yuv,pcm)
flush_packets
:立即将 packets 数据刷新入文件中;genpts
:输出是产生 pts; //pts, presentation timestamp, dts:decoding timestampnofillin
:不填写可以精确计算缺失的值;igndts
:忽略 dts;discardcorrupt
:丢弃损坏的帧;sortdts
:尝试以 dts 的顺序为准输出;keepside
:不合并数据;fastseek
:快速 seek,但是不够精确;latm
:设置 RTP MP4_LATM 生效;nobuffer
:直接读取或者写出,不存 buffer;bitexact
:不写入随机或者不稳定的数据;seek2any
:支持随意 seek,这个 seek 可以不以 keyframe 为参考;analyzeduration
:指定解析媒体所需要花销的时间,这里设置的值越高,解析的越准确,如果在直播中为了降低延迟, 这个可以设置得低一些;codec_whitelist
:设置可以解析的 codec 的白名单;format_whitelist
:设置可以解析的 format 的白名单;
2、ffmpeg 的编转码
FFmpeg 的编解码部分主要是通过 libavcodec 这个库来完成的功能,通过 libavcodec 库进行 encode 与 decode 操作,多媒体的编码格式种类很多,但是还是有好多基本的操作参数是共同可以设置的,下面来详细介绍一下这些公用的参数:
通过查看 ffmpeg 的 help full 参数可以看到 AVCodecContext AVOptions,在这个选项下面的所有参数均为编解码可以使用的参数:
b
:设置音频与视频码率,可以认为是音视频加起来的码率,默认为 200k;使用这个参数可以根据b:v
设置视频码率,b:a
设置音频码率;ab
:设置音频的码率, 默认是 128k;g
:设置视频 GOP 大小,关键帧间隔,默认是 12 帧一个 gop;//r:
帧率,比如 25 帧一个 gopar
:设置音频采样率,默认为 0;ac
:设置音频通道数,默认为 0;bf
:设置非 B 帧之间的 B 帧个数,默认为 0; // Ibbpbbpbbp, Ippppppppmaxrate
:最大码率设置,与 bufsize 一同使用即可, 默认为 0;minrate
:最小码率设置,配合 maxrate 与 bufsize 可以设置为 CBR 模式,平时基本没用, 默认为 0;bufsize
:设置控制码率的 buffer 的大小,默认为 0;keyint_min
:设置最小 IDR 帧间隔,默认为 25;// I 帧,IDR 帧不同;sc_threshold
:设置场景切换支持,默认为 0;me_threshold
:设置运动估计阀值,默认为 0;mb_threshold
:设置宏块阀:threshold 值, 默认为 0;profile
:设置音视频的 profile,默认为 -99;level
:设置音视频的 level,默认为 -99;imecode_frame_start
:设置 GOP 帧的开始时间, 需要在 non-drop-frame 默认情况下使用;channel_layout
:设置音频通道的布局格式;threads
:设置编解码等工作的线程数;
3、ffmpeg 的基本编转码原理
ffmpeg 工具主要用途为编码、解码和转码,常用 ffmpeg 做的为转码操作,使用 ffmpeg 转码主要原理为:
FFmpeg常用命令讲解及实战二(2)https://developer.aliyun.com/article/1472401