FFmpeg 是什么?
笔者才开始学习音视频开发,主要是通过阅读刘歧、赵文杰编著的《FFmpeg从入门到精通》以及雷霄骅博士博客总结写的入门心得体会。
官方文档资料
FFmpeg官方文档:https://ffmpeg.org/documentation.html
FFmpeg官方wiki:http://trac.ffmpeg.org/wiki
中文经典资料
雷霄骅博士csdn链接:https://blog.csdn.net/leixiaohua1020
ChinaFFmpeg:http://bbs.chinaffmpeg.com
除了以上这些信息,还可以通过 Google、百度等搜索引擎获得大量相关资料。
本文这里简单介绍一下 FFmpeg 是什么?
一、FFmpeg的定义
FFmpeg 既是一款音视频编解码工具,同时也是一组音视频编解码开发套件,作为编解码开发套件,它为开发者提供了丰富的音视频的调用接口。
FFMpeg 提供了多种媒体格式的封装和解封装,包括多种音视频编码、多种协议的流媒体、多种色彩格式转换、多种采样率转换、多种码率转换等;FFmpeg 框架提供了多种丰富的插件模块,包含封装与解封装的插件、编码与解码的插件等。
FFmpeg 中的 “FF” 指的是 “Fast Forward”,FFmpeg 中的 “mpeg” 则是 “Moving Picture Experts Group(动态图像专家组)”。
PS:有不少人不清楚 “FFmpeg” 应该怎么读。它读作 “ef ef em peg”。
二、FFmpeg的基本组成模块
FFmpeg 框架的基本组成包括 AVFormat、AVCodec、AVFilter、AVDevice、AVUtil 等模块库。下面针对这些模块做一个大概的介绍。
(1)FFmpeg的封装模块AVFormat
AVFormat 中实现了目前多媒体领域中的绝大多数媒体封装格式,包括封装和解封装,如 MP4、FLV、KV、TS 等文件封装格式,RTMP、RTSP、MMS、HLS 等网络协议封装格式。 FFmpeg 是否支持某种媒体封装格式,取决于编译时是否包含了该格式的封装库。根据实际需求,可进行媒体封装格式的拓展,增加自己定制的封装格式,即在 AVFormat 中增加自己的封装处理模块。
(2)FFmpeg的编解码板块AVCodec
AVCodec 中实现了目前多媒体领域绝大多数常用的编解码格式,既支持编码,也支持解码。AVCodec 除了支持 MPEG4、AAC、MJPEG 等自带的媒体编解码格式之外,还支持第三方的编解码器,如 H.264(AVC)编码,需要使用 x264 编码器;H.265(HEVC)编码,需要使用 X265 编码器;MP3(mp3lame)编码,需要使用 libmp3lame 编码器。如果希望增加自己的编码格式,或者硬件编解码,则需要在 AVCodec 中增加相应的编解码模块。
(3)FFmpeg的滤镜模块AVFilter
AVFilter 库提供了一个通用的音频、视频、字幕等滤镜处理框架。在 AVFilter 中,滤镜框架可以有多个输入或多个输出。
(4)FFmpeg的视频图像转换计算模块swscale
swscale 模块提供了高级别的图像转换 API,例如它允许进行图像缩放和像素格式转换,常见于将图像从 1080p 转换成 720p 或者 480p 等的缩放,或者将图像数据从 YUV420P 转换成 YUYV,或者 YUV 转 RGB 等图像格式转换。
(5)FFmpeg的音频转换计算模块swresample
swresample 模块提供了高级别的音频重采样 API。例如它允许操作音频采样、音频通道布局转换与布局调整。
三、FFmpeg的主要工作流程
FFmpeg 的主要工作流程相对比较简单,具体如下:
1)解封装(Demuxing)
2)解码(Decoding)
3)编码(Encoding)
4)封装(Muxing)
其中需要经过 6 个步骤,具体如下:
1)读取输入源
2)进行音视频的解封装
3)解码每一帧音视频数据
4)编码每一帧音视频数据
5)进行音视频的重新封装
6)输出到目标
FFmpeg 整体处理的工作流程与步骤如下图所示:

四、FFmpeg的相关术语
媒体流(Stream):表示在时间轴上的一段连续的数据,比如一段声音数据、一段视频数据或者一段字母数据,可以是压缩的,也可以是非压缩的,压缩的数据需要关联特定的编解码器。
数据帧/数据包(Frame/Packet):通常一个媒体流是由大量的数据帧组成的,对于压缩数据,帧对应着编解码器的最小处理单元,分属于不同媒体流的数据帧交错存储与容器之中。
编解码器:编解码器是以帧为单位实现压缩数据和原始数据之间的相互转换的。
前面介绍的术语,就是 FFmpeg 中抽象出来的概念。其中:
1. AVFormatContext:就是对容器或者媒体文件层次的抽象。
2. AVStream:在文件中(容器里面)包含了多路流(音频流、视频流、字幕流),AVStream 就是对流的抽象。
3. AVCodecContext 与 AVCodec:在每一路流中都会描述这路流的编码格式,对编解码器格式以及编解码器的抽象就是 AVCodecContext 与 AVCodec。
4. AVPacket 与 AVFrame:对于编码器或者解码器的输入输出部分,也就是压缩数据以及原始数据的抽象就是 AVPacket 与 AVFrame。
5. AVFilter:除了编解码之外,对音视频的处理肯定是针对于原始数据的处理,也就是针对 AVFrame 的处理,使用的就是 AVFilter。
五、FFmpeg的一些应用场景
下面介绍一下 FFmpeg 都用在了哪里(在这里仅列几个我所知的,其实远比这个多)。说白了就是为了说明:FFmpeg 是非常重要的。
使用 FFmpeg 作为内核视频播放器:
- Mplayer,ffplay,射手播放器,暴风影音,KMPlayer,QQ影音...
使用 FFmpeg 作为内核的 Directshow Filter:
- ffdshow,lav filters...
使用 FFmpeg 作为内核的转码工具:
- ffmpeg,格式工厂...
事实上,FFmpeg 的音视频编解码功能确实太强大了,几乎囊括了现存所有的音视频编码标准,因此只要做音视频开发,几乎离不开它。
参考:
刘歧、赵文杰编著的《FFmpeg从入门到精通》第1章
FFmpeg 是什么?的更多相关文章
- FFmpeg学习6:视音频同步
在上一篇文章中,视频和音频是各自独立播放的,并不同步.本文主要描述了如何以音频的播放时长为基准,将视频同步到音频上以实现视音频的同步播放的.主要有以下几个方面的内容 视音频同步的简单介绍 DTS 和 ...
- FFmpeg 中AVPacket的使用
AVPacket保存的是解码前的数据,也就是压缩后的数据.该结构本身不直接包含数据,其有一个指向数据域的指针,FFmpeg中很多的数据结构都使用这种方法来管理数据. AVPacket的使用通常离不开下 ...
- FFmpeg + SoundTouch实现音频的变调变速
本文使用FFmpeg + SoundTouch实现将音频解码后,进行变调变速处理,并将处理后的结果保存为WAV文件. 主要有以下内容: 实现一个FFmpeg的工具类,保存多媒体文件所需的解码信息 将解 ...
- 用ffmpeg快速剪切和合并视频
如果直接找视频剪切和合并视频的软件,通常出来的都是大的视频编辑软件或者是有图形界面的剪切软件,大型一点的功能太多安装麻烦,小型一点的功能可能不齐全. 只是简单的剪切或者一下合并一下,还是ffmpeg这 ...
- ffmpeg用法及如何使用fluent-ffmpeg
http://ffmpeg.org/ 官网 ffmpeg(命令行工具) 是一个快速的音视频转换工具. 1.分离视频音频流 ffmpeg -i input_file -vcodec copy -an o ...
- FFmpeg学习4:音频格式转换
前段时间,在学习试用FFmpeg播放音频的时候总是有杂音,网上的很多教程是基于之前版本的FFmpeg的,而新的FFmepg3中audio增加了平面(planar)格式,而SDL播放音频是不支持平面格式 ...
- FFmpeg学习5:多线程播放视音频
在前面的学习中,视频和音频的播放是分开进行的.这主要是为了学习的方便,经过一段时间的学习,对FFmpeg的也有了一定的了解,本文就介绍了 如何使用多线程同时播放音频和视频(未实现同步),并对前面的学习 ...
- FFmpeg数据结构:AVPacket解析
本文主要从以下几个方面对AVPacket做解析: AVPacket在FFmpeg中的作用 字段说明 AVPacket中的内存管理 AVPacket相关函数的说明 结合AVPacket队列说明下AVPa ...
- FFmpeg学习3:播放音频
参考dranger tutorial,本文将介绍如何使用FFmpeg解码音频数据,并使用SDL将解码后的数据输出. 本文主要包含以下几方面的内容: 关于播放音频的需要的一些基础知识介绍 使用SDL2播 ...
- FFmpeg学习2:解码数据结构及函数总结
在上一篇文章中,对FFmpeg的视频解码过程做了一个总结.由于才接触FFmpeg,还是挺陌生的,这里就解码过程再做一个总结. 本文的总结分为以下两个部分: 数据读取,主要关注在解码过程中所用到的FFm ...
随机推荐
- "One or more types required to compile a dynamic expression cannot be found. Are you missing references to Microsoft.CSharp.dll and System.Core.dll?"的解决方法
#事故现场: 在一个.net 4.0 的项目中使用dynamic,示例代码如下: private static void Main(string[] args) { dynamic obj; obj ...
- python面试题及答案 2019
利用切片操作,实现一个trim()函数,去除字符串首尾的空格,注意不要调用str的strip()方法. 正解1: def trim(s): while s[:1] == ' ': s = s[1:] ...
- Python自动群发邮件,只需20行代码!
今日分享 Python自动群发邮件 import smtplib from email import (header) from email.mime import (text, applicatio ...
- 基于 HTML5 WebGL 构建智能城市 3D 场景
前言 随着城市规模的扩大,传统的方式很难彻底地展示城市的全貌,但随着 3D 技术的应用,出现了 3D 城市群的方式以动态,交互式地把城市全貌呈现出来.配合智能城市系统,通过 Web 可视化的方式,使得 ...
- 用Java实现二叉查找树
二叉查找树的实现 1. 原理 二叉查找树,又称为二叉排序树.二叉搜索树.对于树中每一个节点X,它的左子树中所有项的值小于X中的项,而它的右子树中所有项的值大于X中的项.二叉查找树的平均深度为O(log ...
- python基础(8):基本数据类型三(dict)、is和==、编码和解码
1. 字典 1.1 字典的介绍 字典(dict)是python中唯一的一个映射数据类型,它是以{}括起来的键值对组成.在dict中key是唯一的,在保存的时候,根据key来计算出一个内存地址,然后将k ...
- charAt()检测回文
package seday01; /** * char charAt(int index) 返回指定位置对应的字符 * @author xingsir */public class CharAtDem ...
- MySQL学习——操作表里的数据
MySQL学习——操作表里的数据 摘要:本文主要学习了使用DML语句操作表里数据的方法. 插入数据 语法 通过传入数据插入: insert into 表名 [(列名1, …, 列名n)] values ...
- Git笔记----Git仓库常见经典操作命令
首次创建仓库上传项目操作在上一篇https://www.cnblogs.com/tk55/p/11795644.html ----好记性不如烂笔头 再次更新到仓库 不是首次更新内容或文件到远程仓库 g ...
- css伪类实现行号自动填充
css伪类实现行号自动填充 大多数时候我们需要行号自动填充的时候我们可以 大多数时候是插入元素, 在元素里用js填入行号,或者用 ol > li 实现行号填充, 对于上面的方式,都不太灵活,而且 ...