11.格式间转换

ffmpeg工具的最常见用法是从一种音频或视频格式转换为另一种相关的格式。 格式参数在输出文件之前由-f选项设置,或者在输入文件之前也有原始输入,具体的可用格式信息在显示帮助和功能一章中列出来了。

多媒体格式介绍

文件格式

媒体格式是能够存储音频或视频数据的特殊文件类型。 其中一些能够存储更多类型的数据与多个流,这些被称为容器。 第二章列出了可用的媒体格式,并可以使用命令ffmpeg -formats进行显示。

视频文件格式通常可以同时包含视频和音频流,但是有一些特殊的格式,只能包含音频,详细信息在数字音频章节中有描述。

多媒体容器

媒体容器是特定类型的包装文件,用于存储多媒体流和相关元数据的特殊文件格式。 由于音频和视频可以通过各种方法(算法)进行编码和解码,容器提供了将各种媒体流存储在一个文件中的简单方法。 一些容器只能存储音频(AIFF,WAV,XMF等),一些只能存储图片(TIFF …),但大多数容器存储音频,视频,字幕,元数据等。所有列出的视频容器也支持一些 字幕格式,特别是SubRip和Advanced SubStation Alpha。

11.格式间转换 - 图1

媒体容器

如果只更改容器并保留编解码器,我们可以使用-c copy-c:a copy-c:v copy选项:

  1. ffmpeg -i input.avi -q 1 -c copy output.mov

转码和转换

将输入文件使用ffmpeg处理成输出文件称为转换,它可以包括格式之间的转换或者仅修改某些数据,输出媒体格式保持不变的转码。 数据包可以被编码压缩或解压缩,压缩包括使用特定的编解码器。 转码过程可以分为几个部分:

*解复用(demultiplexing) - 基于文件扩展名(.avi,mpg等)被选中来自libavformat库的最好的解复用(解复用器),从输入文件生成编码数据包

  • 解码-数据包是由一个适当的解码器解码,产生未压缩的帧;如果使用-c copy(或-codec copy)选项,则不会发生解码(也不进行过滤)。
  • 可选的过滤器 - 解码的帧可以通过指定的过滤器进行修改
  • 编码 - 未压缩的帧由选定的编码器编码为数据包
  • 复用(multiplexing) - 将数据包复用(multiplexed)为选定的媒体格式。

11.格式间转换 - 图2

作者喜欢这种花花绿绿的图,,我也没办法

ffmpeg中转换的可用选项被划分为通用的和私有的。可以为任何容器、编解码器或设备设置通用选项,私有选项针对所选的编解码器、容器或设备。

编解码器介绍

codec的名字来源于单词编码解码器(或编码解码器),它表示一个设备或软件工具,用于编码和解码一个被压缩的视频或音频流。FFmpeg编解码器定义是一种媒体比特流格式。下一个命令显示可用的编解码器:

  • ffmpeg -codecs …显示的都是解码器和编码器

  • ffmpeg -decoders …只显示解码器

  • ffmpeg -encoders …只显示编码器

    命令行上的编解码器是由-c-codec选项指定的,语法是:

  1. -codec[:stream_specifier] codec_name

可以为输入和输出文件指定编解码器,如果输出包含多个流,则每个流可以使用不同的编解码器。 如果我们在没有编解码器的情况下指定输出格式,则ffmpeg会选择默认编解码器,常见媒体格式的默认编解码器列表如下:

11.格式间转换 - 图3

格式 编解码器 其他数据
.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

11.格式间转换 - 图4

常用音频文件扩展(文件格式)的默认编解码器(编码器)

格式 编解码器 额外数据
.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选项用于设置覆盖而不需要请求。例如,在默认情况下,我们可以使用以下命令来覆盖旧的输出文件:

  1. 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编码器可以使用表中描述的私有选项:

11.格式间转换 - 图5

选项 类型 描述
-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个附加选项:

11.格式间转换 - 图6

选项 类型 描述
-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格式为例,包括下一个选项:

11.格式间转换 - 图7

选项 类型 描述
-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音频编码器可以使用表中描述的其他选项:

11.格式间转换 - 图8

选项 类型 描述
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的视频编码我们可以使用命令:

  1. ffmpeg -i input.avi -target dvd output.mpg