FFmpeg是什么


***【在线视频教程】***

好文章,来自【福优学苑@音视频+流媒体】

简介

    FFMPEG难度比较大,却没有一个循序渐进,由简单到复杂的教程

    现在网上的有关FFMPEG的教程多半难度比较大,不太适合刚接触FFMPEG的人学习;而且很多的例子程序编译通不过,极大地打消了学习的积极性。我自己在刚开始学习FFMPEG的时候也遇到了很大的困难。

    为了帮助更多的人快速成为“大神”,我想总结一个学习FFMPEG的方法,方便大家循序渐进的学习FFMPEG。


PS:有不少人不清楚“FFmpeg”应该怎么读。它读作“ef ef em peg”

image.png



FFmpeg是什么

    FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。

    采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案

    FFmpeg在Linux平台下开发,但它同样也可以在其它操作系统环境中编译运行,包括Windows、Mac OS X等。

    这个项目最早由Fabrice Bellard发起,2004年至2015年间由Michael Niedermayer主要负责维护。许多FFmpeg的开发人员都来自MPlayer项目,而且当前FFmpeg也是放在MPlayer项目组的服务器上。

    项目的名称来自MPEG视频编码标准,前面的"FF"代表"Fast Forward"。




FFmpeg的组成

   构成FFmpeg主要有三个部分,

第一部分:工具

    第一部分是四个作用不同的工具软件,分别是:ffmpeg.exe,ffplay.exe,ffserver.exe和ffprobe.exe

ffmpeg.exe:音视频转码、转换器

ffplay.exe:简单的音视频播放器

ffserver.exe:流媒体服务器

ffprobe.exe:简单的多媒体码流分析器


第二部分:SDK

    第二部分是可以供开发者使用的SDK,为各个不同平台编译完成的库。

    如果说上面的四个工具软件都是完整成品形式的玩具,那么这些库就相当于乐高积木一样,我们可以根据自己的需求使用这些库开发自己的应用程序。这些库有:

libavcodec:包含音视频编码器和解码器

libavutil:包含多媒体应用常用的简化编程的工具,如随机数生成器、数据结构、数学函数等功能

libavformat:包含多种多媒体容器格式的封装、解封装工具

libavfilter:包含多媒体处理常用的滤镜功能

libavdevice:用于音视频数据采集和渲染等功能的设备相关

libswscale:用于图像缩放和色彩空间和像素格式转换功能

libswresample:用于音频重采样和格式转换等功能


第三部分:源码

    第三部分是整个工程的源代码,无论是编译出来的可执行程序还是SDK,都是由这些源代码编译出来的。

    FFmpeg的源代码由C语言实现,主要在Linux平台上进行开发。

    FFmpeg不是一个孤立的工程,它还存在多个依赖的第三方工程来增强它自身的功能。

    在当前这一系列的博文/视频中,我们暂时不会涉及太多源代码相关的内容,主要以FFmpeg的工具和SDK的调用为主。




FFmpeg主要功能

    多媒体视频处理工具FFmpeg有非常强大的功能包括视频采集功能、视频格式转换、视频抓图、给视频加水印等。

视频采集功能

    ffmpeg视频采集功能非常强大,不仅可以采集视频采集卡或USB摄像头的图像,还可以进行屏幕录制,同时还支持以RTP方式将视频流传送给支持RTSP的流媒体服务器,支持直播应用。


视频格式转换功能

    ffmpeg视频转换功能。视频格式转换,比如可以将多种视频格式转换为flv格式,可不是视频信号转换 。

    ffmpeg可以轻易地实现多种视频格式之间的相互转换(wma,rm,avi,mod等),例如可以将摄录下的视频avi等转成视频网站所采用的flv格式。


视频截图功能

    对于选定的视频,截取指定时间的缩略图。

    视频抓图,获取静态图和动态图,不提倡抓gif文件;因为抓出的gif文件大而播放不流畅。


给视频加水印功能

    使用ffmpeg 视频添加水印(logo)。




FFmpeg八大库

1.libavutil

    核心工具库,最基础模块之一,其他模块都会依赖该库做一些基本的音视频处理操作


2. libavformat

    文件格式和协议库,封装了Protocol层和Demuxer、Muxer层,使得协议和格式对于开发者来说是透明的


3. libavcodec

    编解码库,封装了Codec层,但是有一些codec是具备自己的License的,FFmpe不会默认添加像libx264、FDK-AAC、Lame等库,但是FFmpeg是一个平台,可以将其他的第三方codec以插件的方式添加进来,为开发者提供统一接口


4.libavfilter

    音视频滤镜库,该模块包含了音频特效和视频特效的处理,在使用FFmpeg的API进行编解码的过程中,可以使用该模块高效的为音视频数据做特效处理


5. libavdevice

    输入输出设备库,比如需要编译出播放声音或者视频的工具ffplay,就需要确保该模块是打开的,同事也需要libsdl的预先编译,该设备模块播放声音和视频都又是使用libsdl库


6.libswresample

    用于音频重采样,可以对数字音频进行声道数、数据格式、采样率等多种基本信息的转换


7.libswscale

    该模块用于图像格式转换,可以将YUV的数据转换为RGB的数据


8.libpostproc

    该模块用于进行后期处理,当我们使用filter的时候,需要打开这个模块,filter会用到这个模块的一些基础函数


比较老的ffmpeg还会编译出avresamle模块,也是用于对音频原始出具进行重采样的,但是已经被废弃,推荐使用libswresample替代

另外,库里还可以包含对H.264/MPEG-4 AVC视频编码的X264库,是最常用的有损视频编码器,支持CBR、VBR模式,可以在编码的过程中直接改变码率的设置,在直播的场景中非常适用!可以做码率自适应的功能



好文章,来自【福优学苑@音视频+流媒体】
***【在线视频教程】***