多媒体处理工具-ffmpeg
2011-11-23 14:39:32 阿炯

FFmpeg(FastForward Mpeg)项目是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源应用程序,它包括了目前领先的音、视频编码库libavcodec。是开源多媒体框架,是用于录制、转换、编辑和串流音频和视频的完整解决方案,FFmpeg是在Linux下开发,适用于 Windows、Mac 和 BSD,支持大多数视频和音频格式之间的转换,在2000年创立。该项目是由Fabrice Bellard发起的,后由Michael Niedermayer主持。可以轻易地实现多种视频格式之间的相互转换,用C语言开发并在LGPL协议下授权。



FFmpeg is a complete, cross-platform solution to record, convert and stream audio and video. It includes libavcodec - the leading audio/video codec library. FFmpeg is free software licensed under the LGPL or GPL depending on your choice of configuration options.

FFmpeg 是用于处理音频、视频、字幕和相关元数据的多媒体内容的库和工具的合集。到目前为止,该项目的开发者仍然与VLC、MPV、dav1d、x264等多媒体开源项目有着广泛的重叠;其仍是一款遵循GPL的开源软件,其在音视频处理方面表现十分优秀,几乎囊括了现存所有的视音频格式的编码,解码、转码、混合、过滤及播放。作为最受欢迎的视频和图像处理软件,它被来自各行各业的不同公司所广泛使用。同时也是一款跨平台的软件,完美兼容Linux、Windows、Mac OSX等平台。其实它由3大部件组成,号称音视频处理工具三剑客:

Ffmpeg:由命令行组成,用于多媒体格式转换
Ffplay:基于ffmpeg开源代码库libraries做的多媒体播放器
Ffprobe:基于ffmpeg做的多媒体流分析器

Ffmpeg 应该是 FFmpeg 工具集中最核心的利器,支持多种多样的编码器、解码器、封装格式、滤镜功能。FFmpeg框架的基本组成包含AVFormat、AVCodec、AVFilter、AVDevice、AVUtil等模块库,结构图如下:


AVFormat:封装模块

AVFormat中实现了目前多媒体领域中的绝大多数媒体封装格式,包括封装和解封装,如MP4、FLV、KV、TS等文件封装格式,RTMP、RTSP、MMS、HLS等网络协议封装格式。FFmpeg是否支持某种媒体封装格式,取决于编译时是否包含了该格式的封装库。根据实际需求,可进行媒体封装格式的扩展,增加自己定制的封装格式,即在AVFormat中增加自己的封装处理模块。

AVCodec:编解码模块

AVCodec中实现了目前多媒体领域绝大多数常用的编解码格式,即支持编码,也支持解码。AVCodec除了支持MPEG4、AAC、MJPEG等自带的媒体编解码格式之外,还支持第三方的编解码器,如H.264(AVC)编码,需要使用x264编码器;H.265(HEVC)编码,需要使用x264编码器;MP3(mp3lame)编码,需要使用libmp3lame编码器。如果希望增加自己的编码格式,或者硬件编解码,则需要在AVCodec中增加相应的编解码模块。

AVFilter:滤镜模块

AVFilter库提供了一个通用的音频、视频、字幕等滤镜处理框架。在其中滤镜框架可以有多个输入和多个输出。

swresample–FFmpeg的音频转换计算模块,其提供了高级别的音频重采样API。例如允许操作音频采样、音频通道布局转换与布局调整。

swscale–FFmpeg的视频图像转换计算模块,其提供了高级别的图像转换API,例如它允许进行图像缩放和像素格式转换,常见于将图像从1080p转换成720p或者480p等的缩放,或者将图像数据从YUV420p转换成YUYV,或者YUV转RGB等图像格式转换。


AV1 即 AOMedia Video 1 的简称,是一个开放、免专利的视频编码格式,专为通过网络进行流传输而设计。它由开放媒体联盟 (AOMedia) 开发,该联盟由半导体企业、视频点播供应商和网页浏览器开发商于2015年成立。互联网工程任务组 (IETF) 也将这项工作标准化为互联网视频编解码器 (NetVC)。

库:
libavcodec 提供广泛的编解码器实现
libavformat 流协议、容器格式和基本 I / O 访问实现
libavutil hashers、decompressors 和 miscellaneous utility functions 实现
libavfilter 解码的音频和视频过滤修饰实现
libavdevice 访问捕获和播放设备抽象化实现
libswresample 音频混合和程序重采样实现
libswscale 光色转换和程序缩放实现

工具:
ffmpeg 操纵、转换和流传输多媒体内容的命令行工具箱
ffplay 简约的多媒体播放器
ffprobe 检查多媒体内容的简单分析工具
ffserver 直播多媒体流服务器

附加的一些小工具,比如 aviocat、 ismindex 和 qt-faststart等。

参数
其可使用众多参数,参数内容会根据ffmpeg版本而有差异,使用前建议先参考参数及编解码器的叙述。此外,参数明细可用ffmpeg -h显示;编解码器名称等明细可用ffmpeg -formats显示。下列为较常使用的参数。

主要参数
-i:设置输入文件名。
-f:设置输出格式。
-y:若输出文件已存在时则覆盖文件。
-fs:超过指定的文件大小时则退出转换。
-ss:从指定时间开始转换。
-title:设置标题。
-timestamp:设置时间戳。
-vsync:增减Frame使影音同步。

图像参数
-b:设置图像流量,默认为200Kbit/秒(单位请引用下方注意事项)。
-r:设置帧率值,默认为25。
-s:设置画面的宽与高。
-aspect:设置画面的比例。
-vn:不处理图像,于仅针对声音做处理时使用。
-vcodec:设置图像图像编解码器,未设置时则使用与输入文件相同之编解码器。

声音参数
-ab:设置每Channel(最近的SVN版为所有Channel的总合)的流量(单位请引用下方注意事项)。
-ar:设置采样率。
-ac:设置声音的Channel数。
-acodec:设置声音编解码器,未设置时与图像相同,使用与输入文件相同之编解码器。
-an:不处理声音,于仅针对图像做处理时使用。
-vol:设置音量大小,256为标准音量(要设置成两倍音量时则输入512,依此类推)

注意事项
以-b及ab首选项流量时,根据使用的ffmpeg版本,须注意单位会有kbits/sec与bits/sec的不同(可用ffmpeg -h显示说明来确认单位)。

例如,单位为bits/sec的情况时,欲指定流量64kbps时需输入‘ -ab 64k’;单位为kbits/sec的情况时则需输入‘ -ab 64’。

以-acodec及-vcodec所指定的编解码器名称,会根据使用的ffmpeg版本而有所不同。例如使用AAC编解码器时,会有输入aac与libfaac的情况。此外,编解码器有分为仅供解码时使用与仅供编码时使用,因此一定要利用ffmpeg -formats确认输入的编解码器是否能运作。
        
协议
IETF标准:TCP, UDP, Gopher, HTTP, RTP, RTSP和SDP
苹果公司的相关标准:HTTP Live Streaming
RealMedia的相关标准:RealMedia RTSP/RDT
Adobe的相关标准:RTMP, RTMPT(由librtmp实现),RTMPE(由librtmp实现),RTMPTE(由librtmp)和RTMPS(由librtmp实现)
微软的相关标准:MMS在TCP上和MMS在HTTP上

版权说明
由于Libav、FFmpeg是在LGPL、GPL协议下发布的(如果使用了其中一些使用GPL协议发布的模块则必须使用GPL协议),任何人都可以自由使用,但必须严格遵守LGPL、GPL协议。目前有很多播放软件都使用了他俩的代码,但它们并没有遵守LGPL,GPL协议,没有公开任何源代码。Libav、FFmpeg社区便将这些违反协议的公司、组织、个人的网址粘贴“耻辱大厅”(又叫“耻辱柱”)上,并与这些公司/组织/个人商讨如何解决版权争议。

FFmpeg 将支持 Vulkan
Vulkan 近年来势头不小,游戏引擎 Godot 计划年中发布的 4.0 大版本中将支持 Vulkan,Raspberry Pi 也即将迎来 Vulkan 的支持。现在我们还可以看到 FFmpeg 也将支持它。Vulkan 是 OpenGL 的下一代版本,和 DirectX 12 一样都是基于 AMD 私有的 Mantle API。不同的是 Vulkan 是开源的图形 API,它承诺通过给予开发者访问硬件底层的能力而大幅提升 3D 应用的性能。

在最新的 FFmpeg 源码中,整合了许多 Vulkan 代码,添加了一些过滤器,包括:avgblur_vulkan、overlay_vulkan、scale_vulkan 和 chromaber_vulkan。此外还有新的选项让 FFmpeg 选择要在系统上使用的 Vulkan 设备适配器,并且可以以看到,其它基础结构也都朝着支持 FFmpeg Git 中存在的 Vulkan 和 DMA-BUF 处理方向改进。下一个版本的 FFmpeg 可能初步支持 Vulkan。

FFmpeg 诞生 20 周年
2020年12月22日,FFmpeg 发推文庆祝诞生 20 周年,Fabrice Bellard 作为 FFmpeg 的发起者提交了首个 commit。除了 FFmpeg,其他许多知名开源项目,诸如 TinyCC、QEMU、JSLinux 以及比较新的 QuickJS 均出自 Fabrice Bellard 之手,详情查看其主页

FFmpeg 单词中的“FF”指的是“Fast Forward(快速前进)”,MPEG 是制定国际标准的组织,负责制定影音压缩及传输的规格标准。

虽然 FFmpeg 发展到今天已经非常成功,但并非一直都很顺利,项目发起者 Fabrice Bellard 曾领导过 FFmpeg 数年,不过后来 FFmpeg 社区出现分裂,包括 Fabrice Bellard 在内的部分 FFmpeg 开发者决定脱离原组织重新创建新项目,称作 libav。后来 FFmpeg 项目负责人 Michael Niedermayer 将 libav 的代码合并到了 FFmpeg。除了 FFmpeg 的作者和一些“社区之争”事件,FFmpeg 最被人熟知的还有它创建的“耻辱柱”(目前已下线),因为 FFmpeg 属于自由软件,采用了 LGPL 和 GPL 双许可证(具体依据所选的组件),所以任何人都可以在遵守协议的情况下自由使用。不过很多播放软件使用了 FFmpeg 的代码后并没有遵守开源协议公开任何源代码,FFmpeg 社区便将违反开源协议的公司、组织和个人网站贴在“耻辱柱”,韩国播放软件 KMPlayer 以及国产播放器暴风影音、QQ影音都曾上过榜。

FFmpeg 支持 JPEG-XL
被广泛使用的多媒体开源库 FFmpeg 合并了对 JPEG-XL 图像格式的支持。2022年4月下旬,从代码提交记录可以看到,合并的 PR 是对 JPEG-XL 图像编解码器的支持。FFmpeg 正在使用事实上的 libjxl 库来处理 JPEG-XL 内容,并支持图像编码和解码。这项工作包括将 JPEG-XL 图像作为流进行多路复用/解复用,以及围绕此编解码器的其他 FFmpeg 支持工作。

JPEG XL 基于 Google 的 PIK 格式和 Cloudinary的 FUIF 格式(该格式基于 FLIF),它的默认设置能在实现接近无损的视觉效果的同时,提供良好的压缩效果,这一项目希望成为其他光栅有损和无损图像格式的通用替代品。它的比特流格式于 2021 年底完成,并开始被各种开源和闭源应用程序采用。JPEG-XL 的目标是免版税,不过今年早些时候微软获得了有关 JPEG-XL 使用的“rANS”(范围非对称数字系统)数据压缩的专利,这引起了一些担忧。


参考链接

FFmpeg发展轶事

派生分支Libav及其架构一览

FFmpeg版本更新录(202x)


项目主页:http://ffmpeg.org/


该文章最后由 阿炯 于 2024-03-26 09:48:17 更新,目前是第 2 版。