FFmpeg发展轶事
2015-12-01 11:17:10 阿炯

FFmpeg常用参数



1、能力集列表
-formats:列出支持的文件格式。
-codecs:列出支持的编解码器。
-decoders:列出支持的解码器。
-encoders:列出支持的编码器。
-protocols:列出支持的协议。
-bsfs:列出支持的比特流过滤器。
-filters:列出支持的滤镜。
-pix_fmts:列出支持的图像采样格式。
-sample_fmts:列出支持的声音采样格式。

2、常用输入选项
-i filename:指定输入文件名。
-f fmt:强制设定文件格式,需使用能力集列表中的名称(缺省是根据扩展名选择的)。
-ss hh:mm:ss[.xxx]:设定输入文件的起始时间点,启动后将跳转到此时间点然后开始读取数据。

对于输入,以下选项通常是自动识别的,但也可以强制设定。
-c codec:指定解码器,需使用能力集列表中的名称。
-acodec codec:指定声音的解码器,需使用能力集列表中的名称。
-vcodec codec:指定视频的解码器,需使用能力集列表中的名称。
-b:v bitrate:设定视频流的比特率,整数,单位bps。
-r fps:设定视频流的帧率,整数,单位fps。
-s WxH : 设定视频的画面大小。也可以通过挂载画面缩放滤镜实现。
-pix_fmt format:设定视频流的图像格式(如RGB还是YUV)。
-ar sample rate:设定音频流的采样率,整数,单位Hz。
-ab bitrate:设定音频流的比特率,整数,单位bps。
-ac channels:设置音频流的声道数目。

3、常用输出选项
-f fmt:强制设定文件格式,需使用能力集列表中的名称(缺省是根据扩展名选择的)。
-c codec:指定编码器,需使用能力集列表中的名称(编码器设定为”copy“表示不进行编解码)。
-acodec codec:指定声音的编码器,需使用能力集列表中的名称(编码器设定为”copy“表示不进行编解码)。
-vcodec codec:指定视频的编码器,需使用能力集列表中的名称(编解码器设定为”copy“表示不进行编解码)。
-r fps:设定视频编码器的帧率,整数,单位fps。
-pix_fmt format:设置视频编码器使用的图像格式(如RGB还是YUV)。
-ar sample rate:设定音频编码器的采样率,整数,单位Hz。
-b bitrate:设定音视频编码器输出的比特率,整数,单位bps。
-ab bitrate:设定音频编码器输出的比特率,整数,单位bps。
-ac channels:设置音频编码器的声道数目。
-an 忽略任何音频流。
-vn 忽略任何视频流。
-t hh:mm:ss[.xxx]:设定输出文件的时间长度。
-to hh:mm:ss[.xxx]:如果没有设定输出文件的时间长度的画可以设定终止时间点。

4、流标识
FFMPEG的某些选项可以对一个特定的媒体流起作用,这种情况下需要在选项后面增加一个流标识。流标识允许以下几种格式:

流序号。譬如“:1”表示第二个流。
流类型。譬如“:a“表示音频流,流类型可以和流序号合并使用,譬如“:a:1”表示第二个音频流。
节目。节目和流序号可以合并使用。
流标识。流标识是一个内部标识号。

假如要设定第二个音频流为copy,则需要指定-codec:a:1 copy

5、音频选项
-aframes:等价于frames:a,输出选项,用于指定输出的音频帧数目。
-aq:等价于q:a,老版本为qscale:a,用于设定音频质量。
-atag:等价于tag:a,用于设定音频流的标签。
-af:等价于filter:a,用于设定一个声音的后处理过滤链,其参数为一个描述声音后处理链的字符串。

6、视频选项
-vframes:等价于frames:v,输出选项,用于指定输出的视频帧数目。
-aspect:设置宽高比,如4:3、16:9、1.3333、1.7777等。
-bits_per_raw_sample:设置每个像素点的比特数。
-vstats:产生video统计信息。
-vf:等价于filter:v,用于设定一个图像的后处理过滤链,其参数为一个描述图像后处理链的字符串。
-vtag:等价于tag:v,用于设定视频流的标签。
-force_fps:强制设定视频帧率。
-force_key_frames:显式控制关键帧的插入,参数为字符串,可以是一个时间戳,也可以是一个 “expr:”前缀的表达式。如“-force_key_frames 0:05:00”、“-force_key_frames expr:gte(t,n_forced*5)”

7、滤镜选项
-filter_simple 添加简单滤镜

-filter_complex FILTER 添加复杂滤镜

8、高级选项
-re:要求按照既定速率处理输入数据,这个速率即是输入文件的帧率。
-map:指定输出文件的流映射关系。例如 “-map 1:0 -map 1:1”要求将第二个输入文件的第一个流和第二个流写入到输出文件。如果没有-map选项,ffmpeg采用缺省的映射关系。

9、ffprobe参数
简单的说,ffprobe是一个多媒体流分析工具。它从多媒体流中收集信息,并且以人类和机器可读的形式打印出来。它可以用来检测多媒体流的容器类型,以及每一个多媒体流的格式和类型。它可以作为一个独立的应用来使用,也可以结合文本过滤器执行更复杂的处理。

-f format 强制使用某种格式
-sexagesimal 时间单元格式化 HOURS:MM:SS.MICROSECONDS
-pretty 格式美化
-print_format format 格式化(可选值: default, compact, csv, flat, ini, json, xml)
-of format -print_format别名
-select_streams stream_specifier 选择指定流
-sections 打印节的结构和信息
-show_data 显示包数据
-show_data_hash 显示包数据哈希值
-show_error 显示文件探测/检测错误
-show_format 显示格式或者容器信息
-show_frames 显示帧信息
-show_format_entry entry 根据格式/容器信息显示指定entry
-show_packets 显示包信息
-show_programs 显示程序信息
-show_streams 显示流信息
-show_chapters 显示章节信息
-count_frames 统计每个流的帧数
-count_packets 统计每个流的包数
-show_program_version 显示ffprobe版本
-show_library_versions show library versions
-show_versions show program and library versions
-show_pixel_formats 显示像素格式
-show_private_data show private data
-private same as show_private_data
-bitexact force bitexact output
-read_intervals read_intervals set read intervals
-default generic catch all option

10、ffplayer参数
-x 强制设置视频显示窗口的宽度
-y 强制设置视频显示窗口的高度
-S 设置视频显示的宽高
-fs 强制全屏显示
-an 屏蔽音频
-vn 屏蔽视频
-Sn 屏蔽字幕
-ss 根据设置的秒进行定位拖动
-t 设置播放视频/音频长度
-Bytes 设置定位拖动的策略,0为不可拖动,1为可拖动,-1为自动
-Nodisp 关闭图形化显示窗口
-f 强制使用设置的格式进行解析
-window_title 设置显示窗口的标题
-af 设置音频的滤镜
-Codec 强制使用设置的codec进行解码
-autorotate 自动旋转视频
-ast 设置将要播放的音频流
-vst 设置将要播放的视频流
-sst 设置将要播放的字幕流
-Stats 输出多媒体播放状态
-Fast 非标准化规范的多媒体兼容优化
-sync 音视频同步设置可设置根据音频视频进行参考,视频时间参考,或者外部扩展时间进行参考
-autoexit 多媒体播放完毕自动退出ffplay,ffplay默认播放完毕不退出播放器
-exitonkeydown 当有按键按下事件产生时退出ffplay
-exitonmousedown 当有鼠标按键事件产生时退出ffplay
-loop 设置多媒体文件循环播放次数
-framedrop 当CPU资 源占用过高时,自动丢帧
-infbuf 设置无极限的播放器buffer,这个选项常见于实时流媒体播放场景
-vf 视频滤镜设置
-acodec 强制使用设置的音频解码器
-vcodec 强制使用设置的视频解码器
-scodec 强制使用设置的字幕解码器

11、主要函数介绍
FFmpeg提供了丰富的功能,包括但不限于视频和音频的编码、解码、转码、过滤、播放等操作,几乎涵盖了多媒体处理的各个方面。在视频编辑软件、流媒体服务器,还是各种多媒体相关的开发项目中其也提供了丰富的函数调用:

1)av_register_all()
这是一个初始化函数。在使用 FFmpeg 的大多数功能之前,需要调用这个函数来注册所有可用的编解码器、解复用器、复用器等组件。它为后续的多媒体处理操作准备环境,确保系统能够识别和使用各种相关的模块。例如:
av_register_all();

2)avformat_open_input()
用于打开一个输入媒体文件。它接受文件路径和一个 AVFormatContext 指针作为参数。这个函数会尝试探测文件的格式,并初始化 AVFormatContext,为后续读取媒体文件中的流信息等操作做准备。示例代码如下:
AVFormatContext *pFormatCtx = avformat_alloc_context();
if (avformat_open_input(&pFormatCtx, input_filename, NULL, NULL)!= 0) {
    // 处理打开文件失败的情况
}

3)avformat_find_stream_info()
此函数用于读取输入媒体文件中的流信息,如音频流和视频流的参数(编码格式、帧率、分辨率、采样率等)。它需要一个已经打开的 AVFormatContext。通过这个函数,可以获取到媒体文件中各个流的详细信息,以便后续对这些流进行处理。

if (avformat_find_stream_info(pFormatCtx, NULL) < 0) {
    // 处理查找流信息失败的情况
}

4)avcodec_find_decoder()
用于查找指定的解码器。它接受一个编解码器 ID 作为参数,在已注册的解码器中查找匹配的解码器。在多媒体解码过程中,这是一个关键步骤,找到合适的解码器才能对媒体流进行正确的解码。例如:
AVCodec *pCodec = avcodec_find_decoder(codec_id);
if (!pCodec) {
    // 处理找不到解码器的情况
}

5)avcodec_open2()
这个函数用于打开找到的解码器,并初始化相关的上下文。它接受一个 AVCodecContext 和一个 AVCodec 指针作为参数,完成解码器的初始化工作,为后续的解码操作做好准备。

AVCodecContext *pCodecCtx = avcodec_alloc_context3(pCodec);
if (avcodec_open2(pCodecCtx, pCodec, NULL) < 0) {
    // 处理打开解码器失败的情况
}

6)av_read_frame()
用于从输入媒体文件中读取一个帧数据。它从已经打开的 AVFormatContext 中读取下一个音频或视频帧,并将其存储在 AVPacket 结构体中。这个函数是在读取媒体文件数据过程中的核心函数之一。

AVPacket packet;
if (av_read_frame(pFormatCtx, &packet) >= 0) {
    // 处理读取到的帧数据
}

7)avcodec_decode_video2()(对于视频解码)和 avcodec_decode_audio4()(对于音频解码)
这两个函数分别用于解码视频帧和音频帧。它们接受相应的 AVCodecContext 和存储帧数据的结构体指针作为参数,对从媒体文件中读取到的帧数据进行解码操作,将解码后的数据存储在相应的结构体中,如 AVFrame 结构体。

// 视频解码示例
AVFrame *pFrame = av_frame_alloc();
int got_frame;
avcodec_decode_video2(pCodecCtx, pFrame, &got_frame, &packet);
if (got_frame) {
    // 处理解码后的视频帧
}

// 音频解码示例
AVFrame *pAudioFrame = av_frame_alloc();
int got_audio_frame;
avcodec_decode_audio4(pAudioCodecCtx, pAudioFrame, &got_audio_frame, &packet);
if (got_audio_frame) {
    // 处理解码后的音频帧
}

8)av_write_frame() 和 av_write_trailer()(用于输出媒体文件)
在生成输出媒体文件时,av_write_frame()函数用于将编码后的帧数据写入到输出文件中。而 av_write_trailer()则用于在写入所有帧数据后,写入文件的结尾信息,完成输出媒体文件的生成过程。

// 写入帧数据
av_write_frame(pOutputFormatCtx, &packet);

// 完成输出
av_write_trailer(pOutputFormatCtx);


Linux Firefox发行版将默认采用 FFmpeg

2015年12月上旬消息,绝大部分Linux发行版中都包含了FFmpeg,最近Mozilla也决定在Firefox中采用最新的FFmpeg包,这个决定应该也不会让人感觉到意外,虽然对Firefox而言这也是个比较重要的变化。FFmpeg是知名的多媒体框架,这套解决方案本身已经相当流行。绝大部分Linux发行版都采用该方案,且默认融入到系统中,或者至少也有其一席之地。Linux系统之一的Debian就从Libav转到了FFmpeg

FFmpeg说得具体些,是提供播放任意多媒体数据的各种应用与库的集合。它并不仅针对Linux,Windows平台上也有。它能够从源码中编译,而且对各种架构都是适用的,包括x86、ARM、PowerPC等。

关于Firefox采用FFmpeg,最早是在9月份就提出的,该特性现已加入到Firefox 43 beta版中,很快稳定版分支也将加入。Firefox的Bugzilla如此描述这项BUG条目:“将默认采用FFmpeg PDM(如果ffmpeg在系统中可用的话),默认将使用libav 9或FFmpeg 2.2。如果设置media.fragented-mp4.ffmpeg.enabled,则将允许使用libav 0.7和ffmpeg 0.8或更新版本。”

2004年11月9日,Firefox 发布了首个版本,向垄断了整个浏览器市场的 IE 发起了挑战。从某种意义上它成功了,在 Firefox 诞生之初,IE 占据了九成以上的份额,到了 2009 年 Firefox 成功占据了三分之一的市场份额。但随后由于 Google Chrome 的出现 Firefox 的份额开始萎缩,原因之一是 Chrome 确实性能更为出色,其它原因还有搜索巨头的实力要比非盈利的 Mozilla 强大得多,有足够的预算进行推广。

2016 年 Mozilla 宣布了 Quantum 计划,以致力于大幅改进浏览器性能。2017 年它发布了首个基于 Quantum 的版本,大受好评。Firefox 源于 Netscape,1998 年 Netscape 宣布将在 Mozilla 名义下开源其代码,1999 年 AOL 收购了 Netscape。

Mozilla Firefox 最早的名字叫 Phoenix,意思就是从 Netscape 灰烬中涅槃而生。但 BIOS 开发商 Phoenix Technologies 当时有个运行在 BIOS 上的浏览器叫 Phoenix browser,所以因为商标争议它改名 Firebird,但 Firebird 也有人用,当时一个流行的开源数据库就叫 Firebird,最后它更改为现在的名字 Firefox。

FFmpeg开发的VP9解码器比Google官方的更快

2014年3月上旬消息,开源编解码器项目FFmpeg编写的VP9解码器FFvp9比Google开发的更快。VP9是Google主导开发的下一代开源视频编解码器,压缩效率比H264高一倍,是私有编解码器H265的竞争对手。FFvp9声称在不同机器上其解码速度比Google开发的快25~50%,其多线程性能有显著改进。这一结果并不出人意料,FFmpeg开发的VP8解码器也比Google的快。

参考文档:The world’s fastest VP9 decoder: ffvp9

FFmpeg 项目负责人 Michael Niedermayer 辞职

2015年8月上旬消息,FFmpeg社区再次发生了一件“戏剧性”的事件:担任 FFmpeg 项目负责人长达11年的 Michael Niedermayer宣布辞职

Michael 的辞职与 Libav 分支有关。Debian 项目上个月宣布用 FFmpeg 取代 Libav,一个主要理由是 Libav 的安全更新没有FFmpeg 及时。Debian 抛弃 Libav 对其打击非常大。Libav 是在2011年“起义”脱离 FFmpeg 创建的一个分支,一度吸引了包括 Debian 在内的发行版采用。但过去几年 FFmpeg 在 Michael 的领导下比 Libav 发展更快更活跃,因此许多发行版回到了 FFmpeg 的怀抱,Debian 是仅剩的一个继续使用 Libav 的主流发行版,它抛弃 Libav 项目意味着 Libav 可能会死亡。

Libav 项目开发者则指责 Michael 盗用了他们的成果。他将 Libav 的代码合并到 FFmpeg,让他成为了 FFmpeg 最大的贡献者,他递交代码一度占了新增代码的80%。但 Michael 的支持者则持相反意见。其在辞职信中称,他希望两个社区最终能合并,Libav 能重新加入 FFmpeg。但即使 Debian 准备移除 Libav,仍然没有迹象显示 Libav 考虑加入 FFmpeg。双方的分歧显然非常大,他希望他的辞职能让双方坐下来,避免彻底的分裂。

龙芯 FFmpeg 进入 5.0 时代,全力支持 LoongArch 生态


2022年1月消息,伴随FFmpeg 5.0 的正式发布,新版本集成了对 LoongArch 生态的支持和优化。近日,龙芯中科就龙芯 FFmpeg 5.0 版本工作及规划进行了系统介绍。FFmpeg 5.0 是 FFmpeg 社区近年来最为重要的一个版本,此版本不仅增加了诸多新功能,在 API 方面也进行了重大升级。整合对 LoongArch 的支持意味着后续的开源操作系统在从上游社区集成 FFmpeg 时,都将自动包含对 LoongArch 架构的支持,免去了以往繁重的代码移植和测试工作,对于 LoongArch 生态建设至关重要。据介绍,伴随着支持 LoongArch 的 FFmpeg 5.0 版本发布,龙芯5000桌面处理器平台能更好地释放潜能,为龙芯电脑终端带来更佳的音视频体验,具体到使用体验以及技术支持上将有以下重要提升:

支持 4K 高码率
FFmpeg 5.0版本中集成了对H264、H265、VP8、VP9、MPEG4、WMV3等视频格式的最新解码优化。以H264格式为例,结合支持LoongArch架构的龙芯3A5000平台测试,性能相比龙芯3A4000平台提升75%以上,纯软件解码播放4K H264视频可以支持达到50Mbps高码率。

支持多人流畅视频及录屏
FFmpeg 5.0版本不仅仅针对编解码avcodec模块做了优化,还针对像素处理swscale模块做了优化,结合龙芯团队在X264项目上的编码优化以及mesa的渲染优化,可实现对视频会议系统以及录屏类应用的良好支持。以网动视频会议为例,在流畅支持多人视频会议和本地桌面共享时,龙芯CPU占用率维持在40%左右。

更全面及时的社区支持工作
龙芯团队将更为密切地与社区开发者互动,更加全面的支持LoongArch生态和FFmpeg社区建设。龙芯团队将持续为FFmpeg社区提供基于LoongArch架构的patchwork实时测试服务和FATE状态定期更新服务。希望更多的社区爱好者能够关注支持,加入到LoongArch生态的建设中。

龙芯FFmpeg展望
下一阶段,龙芯团队将持续优化龙芯5000桌面平台视频编解码软硬件协同工作,稳定保障FFmpeg社区支持工作,增加LoongArch架构对滤镜filter模块的支持,为更加出色的LoongArch生态影音体验不懈努力。

英特尔在 FFmpeg 中实现了 AV1 QSV 编码器

2022年8月,英特尔为 FFmpeg 提供了 openVPL 支持,可用于将视频编码/解码为 AV1 和其它格式。2022年10月下旬,英特尔工程师又为 FFmpeg 提供了一个 AV1 快速同步视频 (Quick Sync Video - QSV) 编码器。“快速同步” 视频编码器是指将视频从例如 DVD 或蓝光光盘快速转码为适用于手机等智能设备格式(主要是 H.264)的用例,对专业的视频工作场景非常有效。新的 qsvenc_av1/av1_qsv编码器已合并到 FFmpeg 主线。在 Windows 和 Linux 上,QSV API 可通过 Intel Media SDK 获得,Intel Quick Sync Video AV1 编码器在底层使用 oneVPL 作为视频处理库,该库是 Intel 优秀的开源 oneAPI 软件套件的一部分。从该提交可以看到 AV1 QSV 编码器的源代码,该编码器仅在启用 libvpl 时可用,MSDK 不支持 AV1 编码。

英特尔最新的 DG2/Alchemist GPU(例如最近推出的 Arc  A750 和 A770 显卡)可使用独立显卡硬件加速 AV1 编码。对于无法进行 AV1 编码的 GPU 用户,FFmpeg 在针对 libaom、rav1e 或英特尔开发的 SVT-AV1 构建时也支持基于 CPU 的 AV1 编码。其工程师于2022年12月上旬发布了最新的 “2022Q3” 以及 “2022Q41 RC1”   FFmpeg 补丁集,最新的补丁用于改进 FFmpeg 视频加速与英特尔图形,存放在英特尔的 “cartwheel-ffmpeg” 仓库中,该仓库是英特尔开发者的暂存区,用于为 FFmpeg 贡献未合并的英特尔硬件补丁。换而言之,这是一个试验区,所有补丁都需要经过审查、适当的测试,最终才能合并到上游。据外媒 Phoronix 介绍,最新的 2022Q3 系列 FFmpeg 补丁具有以下优化:
新增 Raptor Lake S 平台的 FFmpeg 支持
ffmpeg-vaapi 添加了 av1 编码支持、
ffmpeg-qsv vpp 缩放通过支持 EU、VDBOX 或 VEBOX 的 oneVPL 添加模型选择,用户可以使用 “scale_mode” 选项来选择硬件型号
对 H.265 QSV 编码的自适应 I/B 支持
ffmpeg dnn:OpenVINO 完整的 GPU 检测和分类支持
ffmpeg dnn:启用 Torch 库作为 FFmpeg DNN 后端之一

此外还有 2022Q41 RC1 系列补丁,但此系列目前尚无更改日志。对于使用 Intel Arc Graphics 硬件的用户,Intel 的 FFmpeg cartwheel 可提供最新和最好的图像驱动支持。目前英特尔的大部分工程重点都放在 DG2/Alchemist 系列显卡的支持上。但在英特尔图形硬件上进行的测试结果显示: FFmpeg 补丁的优化范围可以追溯到带集成显卡的 Tigerlake/Icelake/JasperLake 架构上,甚至还有一些 Kabylake/Comet Lake 覆盖。



该文章最后由 阿炯 于 2024-10-28 10:01:04 更新,目前是第 3 版。