写在前面
如果您对音视频技术感兴趣,可以订阅我的专题:音视频专辑
也可以关注我的简书账户: 张芳涛,我后期会发布更多的音视频以及图像处理方面的文章。
正文
ffmpeg工具的最常见用法是从一种音频或视频格式转换为另一种相关的格式。 格式参数在输出文件之前由-f选项设置,或者在输入文件之前也有原始输入,具体的可用格式信息在显示帮助和功能一章中列出来了。
多媒体格式介绍
文件格式
媒体格式是能够存储音频或视频数据的特殊文件类型。 其中一些能够存储更多类型的数据与多个流,这些被称为容器。 第二章列出了可用的媒体格式,并可以使用命令ffmpeg -formats
进行显示。
视频文件格式通常可以同时包含视频和音频流,但是有一些特殊的格式,只能包含音频,详细信息在数字音频章节中有描述。
多媒体容器
媒体容器是特定类型的包装文件,用于存储多媒体流和相关元数据的特殊文件格式。 由于音频和视频可以通过各种方法(算法)进行编码和解码,容器提供了将各种媒体流存储在一个文件中的简单方法。 一些容器只能存储音频(AIFF,WAV,XMF等),一些只能存储图片(TIFF ...),但大多数容器存储音频,视频,字幕,元数据等。所有列出的视频容器也支持一些 字幕格式,特别是SubRip和Advanced SubStation Alpha。
如果只更改容器并保留编解码器,我们可以使用
-c copy
或-c:a copy
或-c:v copy
选项:
ffmpeg -i input.avi -q 1 -c copy output.mov
转码和转换
将输入文件使用ffmpeg处理成输出文件称为转换,它可以包括格式之间的转换或者仅修改某些数据,输出媒体格式保持不变的转码。 数据包可以被编码压缩或解压缩,压缩包括使用特定的编解码器。 转码过程可以分为几个部分:
*解复用(demultiplexing) - 基于文件扩展名(.avi,mpg等)被选中来自libavformat库的最好的解复用(解复用器),从输入文件生成编码数据包
- 解码-数据包是由一个适当的解码器解码,产生未压缩的帧;如果使用
-c copy
(或-codec copy
)选项,则不会发生解码(也不进行过滤)。 - 可选的过滤器 - 解码的帧可以通过指定的过滤器进行修改
- 编码 - 未压缩的帧由选定的编码器编码为数据包
-
复用(multiplexing) - 将数据包复用(multiplexed)为选定的媒体格式。
ffmpeg中转换的可用选项被划分为通用的和私有的。可以为任何容器、编解码器或设备设置通用选项,私有选项针对所选的编解码器、容器或设备。
编解码器介绍
codec的名字来源于单词编码解码器(或编码解码器),它表示一个设备或软件工具,用于编码和解码一个被压缩的视频或音频流。FFmpeg编解码器定义是一种媒体比特流格式。下一个命令显示可用的编解码器:
ffmpeg -codecs
...显示的都是解码器和编码器ffmpeg -decoders
...只显示解码器-
ffmpeg -encoders
...只显示编码器
命令行上的编解码器是由-c
或-codec
选项指定的,语法是:-codec[:stream_specifier] codec_name
可以为输入和输出文件指定编解码器,如果输出包含多个流,则每个流可以使用不同的编解码器。 如果我们在没有编解码器的情况下指定输出格式,则ffmpeg会选择默认编解码器,常见媒体格式的默认编解码器列表如下:
格式 | 编解码器 | 其他数据 |
---|---|---|
.avi | mpeg4 | mpeg4 (Simple profile), yuv420p; audio: mp3 |
.flv | flv1 | yuv420p; audio: mp3 |
.mkv | h264 | h264 (High), yuvj420p; audio: vorbis codec, fltp sample format |
.mov | h264 | h264 (High), yuvj420p; audio: aac (mp4a) |
.mp4 | h264 | h264 (High), yuvj420p; audio: aac (mp4a) |
.mpg | mpeg1video | yuv420p; audio: mp2 |
.ogg | theora | yuv422p, bitrate very low; audio excluded during conversion |
.ts | mpeg2video | yuv422p; audio: mp2 |
.webm | vp8 | yuv420p; audio: vorbis codec, fltp sample format |
格式 | 编解码器 | 额外数据 |
---|---|---|
.aac | aac | libvo_aacenc, bitrate 128 kb/s |
.flac | flac | FLAC (Free Lossless Audio Codec), bitrate 128 kb/s |
.m4a | aac | mp4a, bitrate 128 kb/s |
.mp2 | mp2 | MPEG Audio Layer 2, bitrate 128 kb/s |
.mp3 | mp3 | libmp3lame, bitrate 128 kb/s |
.wav | pcm_s16le | PCM (Pulse Code Modulation), uncompressed |
.wma | wmav2 | Windows Media Audio |
覆盖相同的命名输出文件
如果在ffmpeg命令中具有指定名称的文件已经存在,控制台将请求“y”(yes)或“n”(no)来覆盖旧文件。为了避免这个问题,可以使用-n选项来取消处理,-y选项用于设置覆盖而不需要请求。例如,在默认情况下,我们可以使用以下命令来覆盖旧的输出文件:
ffmpeg -y -i input.avi output.mp4
通用选项转换
通用选项可设置为任何编解码器、容器或设备。在表中描述了与编码器(codec)规范相关的转换中包含的最常见的通用选项,目标列包含5个字母代码,限制了特定选项的使用。某些字母的存在意味着该选项适用于编码(E)、解码(D)、视频(V)、音频(A)或字幕(S)。
选项 | 类型 | 标签 | 描述 |
---|---|---|---|
-flags | flags | EDVAS | 数值:(ffmpeg帮助的详细信息):mv4、qpel、loop、gmc、mv0、gray、psnr、naq、ildct、low_delay、global_header、bitreal、aic、cbp、qprd、ilme、cgop |
-me_method | int | E..V.. | 数值:(请参阅ffmpeg帮助详细信息):0、full、epzs、esa、tesa、dia、log、phods、x1、hex、umh、iter |
-g | int | E..V.. | 设置图片组大小 |
-qcomp | float | E..V.. | 视频量化压缩(VBR)。ratecontrol方程的常数。默认rc_eq: 0-1.0的推荐范围 |
-qblur | float | E..V.. | 视频量化器尺度模糊(VBR) |
-qmin | int | E..V.. | 最小视频量化器规模(VBR) |
-qmax | int | E..V.. | 最大视频数字转换器规模(VBR) |
-qdiff | int | E..V.. | 量化器的最大差异(VBR) |
-bf | int | E..V.. | 使用“帧”B帧 |
-b_qfactor | float | E..V.. | p和b之间的qp因子 |
-rc_strategy | int | E..V.. | ratecontrol方法 |
-b_strategy | int | E..V.. | 在I/P/ b帧之间选择策略 |
-ps | int | E..V.. | rtp负载大小以字节为单位 |
-lelim | int | E..V.. | 亮度的单系数消除阈值(负值也考虑直流系数) |
-celim | int | E..V.. | 色度的单系数消除阈值(负值也考虑直流系数) |
-strict | int | ED.VA. | 如何严格遵循标准,值为(请参阅ffmpeg帮助细节):very, strict, normal, unofficial, experimental |
-b_qoffset | float | E..V.. | qp偏移在P和B帧之间 |
-err_detect | flags | .D.VA. | 设置错误检测标志,值为(请参阅ffmpeg帮助细节):crccheck, bitstream, buffer, explode, careful, compliant, aggressive |
-mpeg_quant | int | E..V.. | 使用MPEG量化器代替H.263 |
-qsquish | float | E..V.. | 如何在qmin - qmax (0=clip, 1=使用可微函数)之间保持量化器 |
-rc_qmod_amp | float | E..V.. | 实验量化器调制 |
-rc_qmod_freq | int | E..V.. | 实验量化器调制 |
-rc_eq | string | E..V.. | 设置速度控制方程。在计算表达式时,除了在数学函数章节中定义的标准函数外,还有以下函数:bits2qp(bits), qp2bits(qp)。也可以使用以下常数:iTex pTex texmv fCode iCount mcVar iount isB avgQP qComp avgpiex avgPPTex avgTex |
-i_qfactor | float | E..V.. | P和I之间的qp因子 |
-i_qoffset | float | E..V.. | qp偏移在P和I帧之间 |
-rc_init_cplx | float | E..V.. | 1-pass编码的初始复杂度 |
-dct | int | E..V.. | DCT算法,值为(请参阅ffmpeg帮助细节):auto, fastint, int, mmx, altivec, faan |
-lumi_mask | float | E..V.. | 压缩明亮的区域比中等的区域强 |
-tcplx_mask | float | E..V.. | 时间复杂性掩盖 |
-scplx_mask | float | E..V.. | 空间复杂性掩盖 |
-p_mask | float | E..V.. | inter屏蔽 |
-dark_mask | float | E..V.. | 压缩暗区比中型区域强 |
-idct | int | ED.V.. | 选择IDCT实现,值为(请参阅ffmpeg帮助细节):auto, int, simple, simplemmx, libmpeg2mmx, mmi, arm, altivec, sh4, simplearm, simplearmv5te, simplearmv6, simpleneon, simplealpha, h264, vp3, ipp, xvidmmx, faani |
-ec | flags | .D.V.. | 设置错误隐藏策略,值:guess_mvs(迭代运动矢量(MV)搜索(慢)),deblock (.D.V。使用强大的deblock过滤器,对损坏的MBs) |
-pred | int | E..V.. | 预测方法,值是(更多的见ffmpeg帮助):left, plane, median |
-vismv | int | .D.V.. | 可视化运动矢量(MVs),值是(更多的见ffmpeg帮助):pf, bf, bb |
-cmp | int | E..V.. | 完整的pel我比较函数,值(更多的见ffmpeg帮助章节):sad, sse, satd, dct, psnr, bit, rd, 0, vsad, vsse, nsse, w53, w97, dctmax, chroma |
-subcmp | int | E..V.. | 比较函数,值和-cmp选项(更多的见ffmpeg帮助章节) |
-mbcmp | int | E..V.. | macroblock比较函数,值与-cmp选项(更多的是ffmpeg帮助里面) |
-ildctcmp | int | E..V.. | 交错dct比较函数,值与-cmp选项(更多在ffmpeg帮助章节里面) |
-dia_size | int | E..V.. | 运动估计的diamond 类型和尺寸 |
-last_pred | int | E..V.. | 从上一帧的运动预测器数量 |
-preme | int | E..V.. | 前运动估计 |
-precmp | int | E..V.. | 前运动估计比较函数,值与-cmp选项(更多的见ffmpeg帮助) |
-pre_dia_size | int | E..V.. | 运动预估的diamond类型和尺寸 |
-subq | int | E..V.. | 子波运动估计质量 |
-me_range | int | E..V.. | 极限运动矢量范围(DivX播放器的1023) |
-ibias | int | E..V.. | 内部定量偏差 |
-pbias | int | E..V.. | inter定量偏差 |
-coder | int | E..V.. | 值:vlc(可变长度/huffman编码器),ac(算术),raw(无编码),rle(运行长度),deflate (deflate-based) |
-context | int | E..V.. | 上下文模型 |
-mbd | int | E..V.. | macroblock决策算法(高质量模式),值为(请参阅ffmpeg帮助细节):simple, bits, rd |
-sc_threshold | int | E..V.. | 场景变化阈值 |
-lmin | int | E..V.. | 最小拉格朗日因子(VBR) |
-lmax | int | E..V.. | 最大拉格朗日因子(VBR) |
-flags2 | flags | ED.VA | 值(更多的见ffmpeg帮助):快速、sgop、noout、local_header、块、showall、skiprd |
-threads | int | ED.V.. | 自动数值(检测大量线程) |
-dc | int | E..V.. | intra_dc_precision(不知道怎么翻译) |
-nssew | int | E..V.. | nsse weight |
-skip_top | int | .D.V.. | 在顶部跳过的macroblock行数 |
-skip_bottom | int | .D.V.. | 在底部跳过的macroblock行数 |
-profile | int | E..VA. | 值(更多的键ffmpeg帮助):未知的,aac_main, aac_low, aac_ssr, aac_ltp, aac_he, aac_he_v2, aac_ld, aac_ld, dts, dts_es, dts 96 24, dts_hd_hra, dts_hd_ma |
-level | int | E..VA. | 数值:未知的 |
-lowres | int | .D.VA. | 解码1= 1/2,2=1/4,3=1/8 |
-skip_factor | int | E..V.. | 帧跳跃因素 |
-skip_exp | int | E..V.. | 帧跳跃指数 |
-skipcmp | int | E..V.. | 帧跳过比较函数,与-cmp选项相同的值(更多的信息见帮助) |
-border_mask | float | E..V.. | 增加接近边界的宏块的量化器 |
-mblmin | int | E..V.. | min macroblock拉格朗日因子(VBR) |
-mblmax | int | E..V.. | max macroblock拉格朗日因子(VBR) |
-mepc | int | E..V.. | 运动估计比特率惩罚补偿(1.0 = 256) |
-skip_loop_filter | int | .D.V.. | 值(更多的是ffmpeg帮助):none、default、noref、bidir、nokey、all |
-skip_idct | int | .D.V.. | 和-skip_loop里面参数的值是一样的(更多内容见ffmpeg帮助) |
-skip_frame | int | .D.V.. | 和-skip_loop里面参数的值是一样的(更多内容见ffmpeg帮助) |
-bidir_refine | int | E..V.. | 细化双向宏块中使用的两个运动矢量 |
-brd_scale | int | E..V.. | 用于动态b帧决策的下尺度框架 |
-keyint_min | int | E..V.. | 最小间隔IDR-frames |
-refs | int | E..V.. | 考虑运动补偿的参考系 |
-chromaoffset | int | E..V.. | 色度qp从luma偏移 |
-trellis | int | E..VA. | 率失真优化量化 |
-sc_factor | int | E..V.. | 每一帧乘以qscale,并添加到scene_change_score |
-b_sensitivity | int | E..V.. | 调整b_frame_strategy 1的灵敏度 |
-colorspace | int | ED.V.. | 名字的颜色空间 |
-slices | int | E..V.. | 片数,用于并行编码 |
-thread_type | flags | ED.V.. | 选择多线程类型,值:slice, frame |
-rc_init_occupancy | int | E..V.. | 在解码开始之前,要加载到rc缓冲区的位数 |
-me_threshold | int | E..V.. | 运动估计阈值 |
-mb_threshold | int | E..V.. | macroblock阈值 |
-skip_threshold | int | E..V.. | 帧跳过阈值 |
-timecode_frame_start | int64 | E..V.. | GOP timecode框架启动号码,在非下降帧格式 |
-request_channels | int | .D..A. | 设置所需的音频通道数 |
-channel_layout | int64 | ED..A. | 可用值:ffmpeg布局 |
-audio_service_type | int | E...A. | 音频服务类型,值(更多的见ffmpeg帮助):ma, ef, vi, hi, di, co, em, vo, ka |
-request_sample_fmt | s_fmt | .D..A. | 示例格式音频解码器应使用(列表:ffmpeg -sample_fmts) |
有关如何使用某些选项的示例,请参阅“预设编解码器”一章。 为了保持输出质量相同,我们使用-q
或-qscale [:stream_specifier]
选项来设置固定的质量范围,通常从1到31,其中值1表示最高质量(某些编解码器使用其他比例)。
私有的的选择转选项
虽然可以为任何编解码器,容器或设备设置通用选项,但私有选项是可以仅为选定的编解码器,容器或设备指定的附加选项。
MPEG-1视频编码器
除了通用选项之外,mpeg1video
编码器可以使用表中描述的私有选项:
选项 | 类型 | 描述 |
---|---|---|
-gop_timecode | string | MPEG GOP Timecode在hh:mm:ss[:;]ff格式 |
-intra_vlc | int | 使用MPEG-2 intra VLC表 |
-drop_frame_timecode | int | Timecode采用了drop - frame格式 |
-scan_offset | int | 预留空间用于SVCD扫描偏移用户数据 |
-mpv_flags | flags | 所有基于mpegvideo的编码器通用的标志,值是(更多的ffmpeg帮助):skip_rd, strict_gop, qp_rd, cbp_rd |
-luma_elim_threshold | int | 亮度的单系数消除阈值(负值也考虑直流系数) |
-chroma_elim_threshold | int | 色度的单系数消除阈值(负值也考虑直流系数) |
-quantizer_noise_shaping | int | 没有描述 |
MPEG-2 视频编码器
mpeg2video编码器可以使用mpeg1视频编码器的所有选项和2个附加选项:
选项 | 类型 | 描述 |
---|---|---|
-non_linear_quant | int | 使用非线性量化器 |
-alternate_scan | int | 启用备用表扫描 |
MPEG-4 视频编码器
mpeg4编码器包括前面2个表中描述的下一个选项:
- data_partioning
- alternate_scan
- mpv_flags
- luma_elim_threshold
- chroma_elim_threshold
- quantizer_noise_shaping
libvpx视频编码器
libvpx编码器以WEBM格式为例,包括下一个选项:
选项 | 类型 | 描述 |
---|---|---|
-cpu-used | int | 质量/速度比修饰符 |
-auto-alt-ref | int | 启用备用参考框架(仅2-pass) |
-lag-in-frames | int | 帧的数量,以展望备用参考帧的选择 |
-arnr-maxframes | int | altref降噪最大帧数 |
-arnr-strength | int | altref降噪滤波强度 |
-arnr-type | int | altref降噪滤波类型,值为:向后、正向、中心 |
-deadline | int | 花在编码上的时间,在微秒内,值是:最好的,好的,实时的 |
-error-resilient | flags | 错误恢复配置:值(更多在ffmpeg帮助下):默认值,分区 |
-max-intra-rate | int | 最大i帧比特率(pct) 0=无限 |
-speed | int | 没有描述 |
-quality | int | 价值是:最好的,好的,实时的 |
-vp8flags | flags | 值是(更多的ffmpeg帮助):error_, altref |
-arnr_max_frames | int | altref降噪最大帧数 |
-arnr_strength | int | altref降噪滤波强度 |
-arnr_type | int | altref降噪滤波器类型 |
-rc_lookahead | int | 帧的数量,以展望备用参考帧的选择 |
-crf | int | 选择质量不变的质量模式 |
AC-3音频编码器
ac3音频编码器可以使用表中描述的其他选项:
选项 | 类型 | 描述 |
---|---|---|
per_frame_metadata | integer | 允许改变元数据每帧 |
center_mixlev | float | 中心组合水平 |
surround_mixlev | float | 围绕混合水平 |
mixing_level | integer | 混合水平 |
room_type | integer | 房间类型,值是:不指示,大,小 |
copyright | integer | 版权位 |
dialnorm | integer | 对话水平(dB) |
dsur_mode | integer | 杜比环绕模式,值:不显示,打开,关闭 |
original | integer | 原始比特流 |
dmix_mode | integer | 首选立体声调合模式,值:不显示 |
ltrt_cmixlev | float | lt / rt中心混合水平 |
ltrt_surmixlev | float | lt / rt环绕混合水平 |
loro_cmixlev | float | lo / ro中心混合水平 |
loro_surmixlev | float | lo / ro环绕混合水平 |
dsurex_mode | integer | Dolby环绕EX模式,值:不显示,on, off |
dheadphone_mode | integer | 杜比耳机模式,值:不显示,打开,关闭 |
ad_conv_type | integer | A/D转换器类型,值:标准(默认),hdcd |
stereo_rematrixing | integer | 立体重映射 |
channel_coupling | integer | 通道耦合 值:自动 |
cpl_start_band | integer | 耦合开始band 值:自动 |
简化的VCD、SVCD、DVD、DV、DV50编码
一个特殊的目标选项只允许使用一个选项,而不是特定媒体类型所需要的大量选项(VCD=视频CD、SVCD=超级视频CD、DV=数字视频等),可用的值为:
vcd, pal-vcd, ntsc-vcd, film-vcd
svcd, pal-svcd, ntsc-svcd, film-svcd
dvd, pal-dvd, ntsc-dvd, film-dvd
dv, pal-dv, ntsc-dv, film-dv
-
dv50, pal-dv50, ntsc-dv50, film-dv50
所有需要的参数,如帧率、纵横比、比特率等都是根据特定媒体格式的规格设置的。例如,为DVD的视频编码我们可以使用命令:ffmpeg -i input.avi -target dvd output.mpg