每一个从事音视频技术开发的工程师对FFmpeg都不会感到陌生,即使是刚刚踏入这个行业的初学者,但对他们来说这条路上好像有着一条不可逾越的鸿沟,“雷神”和许多大神都总结过一些FFmpeg的学习方法,小编在这里为大家做一个整理,方便大家有一个清晰的思路。
以下是截取自CSDN对“雷神”的悼念:
中国传媒大学通信与信息系统专业攻读博士雷霄骅,CSDN的老朋友、连续两届CSDN博客之星、微软MVP、博客排名52位,他的博客帮助了很多人,除了在博客上回复大家的问题,以及还有自己的技术交流群,旨在为视音频技术同行方便交流提供一个平台。不幸的是,2016年7月17日凌晨猝死在学校主楼五层,据相关报道称,事发前雷霄骅一直泡在实验室忙碌,怀疑其是劳累过度导致猝死。
基本介绍
FFmpeg是一套非常知名的音视频处理的开源工具,它包含了开发完成的工具软件、封装好的函数库以及源代码供我们按需使用。FFmpeg提供了非常强大的功能,可以完成视频采集、音视频的编码、解码、转码、后处理(抓图、水印、封装/解封装、格式转换等),还有流媒体服务等诸多功能,可以说涵盖了音视频开发中绝大多数的领域。
使用FFmpeg作为内核视频播放器: Mplayer,ffplay,暴风影音,QQ影音,KMplayer…… 使用FFmpeg作为内核的Directshow Filter: ffdshow,lav filters…… 使用FFmpeg作为内核的转码工具: ffmpeg,格式工厂……
原生的FFmpeg是在Linux环境下开发的,但是通过各种方法(比如交叉编译等)可以使它运行在多种平台环境上,具有比较好的可移植性。
FFmpeg历史
FFmpeg项目最初是由Fabrice Bellard发起的,从2004年起由Michael Niedermayer领导进行维护。许多FFmpeg的开发者同时也是MPlayer项目的成员,FFmpeg在MPlayer项目中是被设计为服务器版本进行开发。
2011年3月13日,FFmpeg部分开发人员决定另组Libav,同时制定了一套关于项目继续发展和维护的规则。
FFmpeg编解码器的演进
迄今为止,在FFmpeg项目中已经创建了具有相应编解码器和一种容器格式的两种视频编码格式。两个视频编解码器是无损FFV1,以及无损和有损的Snow编解码器。
2010年夏天,FFmpeg团队的Fiona Glaser,Ronald Bultje和David Conrad宣布退出ffvp8解码器,通过测试证明ffvp8比Google的libvpx解码器更快,从0.6版本开始,FFmpeg也开始支持WebM和VP8。
2013年10月,原生VP9和OpenHEVC解码器——一个开源的高效率视频编码解码器,被添加到FFmpeg中。
2016年,本地AAC编码器被认为是最稳定的,消除了对来自VisualOn和FAAC的两个外部AAC编码器的支持。FFmpeg3.0(昵称“爱因斯坦”)保留了Fraunhofer FDK AAC编码器的构建支持。
FFmpeg的耻辱柱
由于FFmpeg和Libav是在LGPL、GPL下发布的,任何人都可以遵守协议的情况下自由使用。目前有很多播放软件都使用了FFmpeg和Libav的代码,但却没有将任何源代码公开。FFmpeg和Libav社区便将这些违反协议的公司、组织、个人的网址贴在“耻辱柱”上,并与这些公司、组织、个人商讨如何解决版权争议。
FFmpeg组成
FFmpeg主要由三个部分构成。
第一部分是四个不同作用的工具软件,分别是:
- ffmpeg.exe:音视频转码器;
- ffplay.exe:简单的音视频播放器;
- ffserver.exe:流媒体服务器;
- ffprobe.exe:简单的多媒体码流分析器。
第二部分是为各个不同平台编译完成的库,开发者可以根据自己的需求使用这些库开发自己的应用程序。
- libavcodec:包含音视频编码器和解码器;
- libavutil:包含多媒体应用常用的简化编程的工具,如随机数生成器、数据结构、数学函数等。
- libavformat:包含多种多媒体容器格式的封装、解封装工具;
- libavfilter:包含多媒体处理常用的滤镜功能;
- libavdevice:用于音视频数据采集和渲染等功能的设备相关;
- libswscale:用于图像缩放、色彩空间、像素格式转换等功能;
- libswresample:用于音频重采样和格式转换等功能。
第三部分是整个工程的源代码,无论是编译好的可执行程序还是SDK,都是使用这些源代码进行编译的。FFmpeg的源代码由C语言实现,主要在Linux平台进行开发。
FFmpeg工具的使用
ffmpeg工程包可以从官网“Download”页面下载,它提供了三种不同的模式:Static、Shared和Dev。前面两个版本可以直接在命令行中使用,区别在于:Static中只有3个应用程序(ffmpeg.exe,ffplay.exe和ffprobe.exe),而且每个体积都很大,相关的Dll已经被编译到exe中;而Shared中除了上面提到的3个应用程序外还有一些Dll,比如avcodec-54.dll。而且Shared中的exe体积很小。相对于前两个版本,Dev版本是用于开发的,没有exe文件,而是包含了库文件.lib和头文件.h。
1.ffmpeg.exe
ffmpeg.exe可以说是整个工程的核心,它的主要功能是完成音视频的转码:ffmpeg.exe可以将视频文件由原格式转换为其他格式,如从.avi转为.mp4:
ffmpeg -i ../video/IMG_001.MOV../video/output_mpeg4_mp3.avi
ffmpeg默认将视频编码格式选择为mpeg4,音频编码格式为mp3。如果希望保留原始编码,则需要增加参数“-c”(copy,表明不做任何转码操作)。如果需要将视频转换为其他编码格式,则需要在参数中指定目标格式-c:v libx265或-vcodec libx265。
ffmpeg支持的所有编码器格式可以通过以下命令查看:
ffmpeg.exe -encoders
在视频解封装方面,ffmpeg可以将视频中的音频和视频流分别提取出来:需要在命令行中添加参数-an和-vn,分别表示屏蔽音频和视频流。
2.ffplay.exe
ffplay.exe是使用ffmpeg库和SDL库开发的,可以用作FFmpeg API的测试工具。ffplay最简单的使用方法是直接按照默认格式播放一个音视频文件或流:
ffplay.exe -i../video/IMG_001.MOV
除此以外,ffplay还支持传入各种参数来控制播放行为,具体参数可以参考官网的文档。
3.ffprobe.exe
ffprobe.exe可以用于查看音视频文件格式。最简单的使用方法和ffplay类似:
ffprobe.exe -i../video/IMG_001.MOV
分析完成后,ffprobe会显示音视频文件中包含的每个码流的信息,包括编码格式、分辨率、码率、帧率等信息。
FFmpeg源代码分析
了解了FFmpeg库的使用之后就可以开始看源代码,需要注意的是FFmpeg的源代码只有在Linux下才能编译,如果是在Windows环境下就需要使用MinGW进行编译。推荐使用Eclipse查看FFmpeg的源代码。
小编献上雷神分享的一份很完整的ffmpeg源代码的分析文档:
http://download.csdn.net/download/leixiaohua1020/6377803
以上还只是FFmpeg的一些基础介绍,希望可以帮助初学者或感兴趣的小伙伴做一个简单的梳理。此外,我们还准备了【FFmpeg实战开发培训】,由国内唯一保持高活跃度的FFmpeg Maintainer大师兄(刘歧)和后端大神赵文杰共同担任讲师,手把手带你实现从环境搭建到完成推流、播放的一整套直播方案开发。
FFmpeg实战开发培训
FFmpeg培训是由LiveVideoStack和ChinaFFmpeg共同组织并发起的,旨在推动FFmpeg技术在国内的发展,让更多中国开发者了解、掌握此项技术并能应用到实践操作中去。
本次培训将于10月20日在北京丽亭华苑酒店举办,主要针对从业1-3年的开发者人群和有意愿学习FFmpeg技术的相关人士,培训提供全面、系统、深入的FFmpeg技能点讲解,通过现场指导、交流解决实战开发过程中遇到的各类问题,提升FFmpeg技术的理解,获得从环境搭建到实现推流及播放的一整套直播方案的实施经验。
培训内容:
- FFmpeg 介绍
- FFmpeg 编译安装
- FFmpeg 工具集基础介绍(ffmpeg / ffprobe / ffplay)
- FFmpeg Format 实战
- FFmpeg Codec 实战
- FFmpeg Filter 实战
- FFmpeg Device 实战
- 参与 FFmpeg 开发实战