FFmpeg学习(一)概念

参考:

https://blog.csdn.net/guyuealian/article/details/79493019

FFmpeg库介绍

官方文档资料
FFmpeg官方文档:https://ffmpeg.org/documentation.html
FFmpeg官方wiki:http://trac.ffmpeg.org/wiki

FFmpeg 入门学习 (全面详细的介绍,鼎立推荐) 
http://blog.csdn.net/leixiaohua1020/article/details/15811977

ffmpeg 使用参数的中文解说 
http://www.ffmpeg.space/forum.php?mod=viewthread&tid=3#lastpost

FFmpeg的基本组成

FFmpeg框架的基本组成包括AVFormat、AVFilter、AVDevice、AVUtil等模块库。
下面针对这些模块做一个大概的介绍。
(1)的封装模块:AVFormat
AVFormat中实现了目前多媒体领域中的绝大多数媒体封装格式,包括封装和解封装,如MP4、FLV、KV、TS等文件封装格式,RTMP、RTSP、MMS、HLS等网络协议封装格式。
FFmpeg是否支持某种媒体封装格式,取决于编译时是否包含了该格式的封装库。根据实际需求,可进行媒体封装格式的拓展,增加自己定制的封装格式,即在AVFormat中增加自己的封装处理模块。

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

(3)滤镜模块:AVFilter
AVFilter库提供了一个通用的音频、视频、字幕等滤镜处理框架。在AVFilter中,滤镜框架可以有多个输入或多个输出。

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

(5)音频转换计算模块:swresample
swresample模块提供了高级别的音频重采样API。例如它允许操作音频采样、音频通道布局转换与布局调整。

  1. avcodec:编解码(最重要的库)。
  2. avformat:音视频的封装格式处理。
  3. avfilter:滤镜特效处理。
  4. avdevice:各种设备的输入输出。
  5. avutil:实用工具库(大部分库都需要这个库的支持),包括算术运算,字符操作。
  6. postproc:音视频应用的后处理,如图像的去块效应。
  7. swresample:音频采样数据格式转换。
  8. swscale:视频像素数据格式转换

ffmpeg程序的使用(ffmpeg.exe,ffplay.exe,ffprobe.exe)

介绍一下ffmpeg工程包含的三个exe的使用方法。

ffmpeg的官方网站是:http://ffmpeg.org/

编译好的windows可用版本的下载地址(官网中可以连接到这个网站,和官方网站保持同步): http://ffmpeg.zeranoe.com/builds/

该网站中的FFMPEG分为3个版本:Static,Shared,Dev。

前两个版本可以直接在命令行中使用,他们的区别在于:Static里面只有3个应用程序:ffmpeg.exe,ffplay.exe,ffprobe.exe,每个exe的体积都很大,相关的Dll已经被编译到exe里面去了。Shared里面除了3个应用程序:ffmpeg.exe,ffplay.exe,ffprobe.exe之外,还有一些Dll,比如说avcodec-54.dll之类的。Shared里面的exe体积很小,他们在运行的时候,到相应的Dll中调用功能。

Dev版本是用于开发的,里面包含了库文件xxx.lib以及头文件xxx.h,这个版本不包含exe文件。

打开系统命令行接面,切换到ffmpeg所在的目录,就可以使用这3个应用程序了。

 

FFmpeg解码函数简介:

av_register_all();//注册所有文件格式和编解码库
avformat_network_init();//打开网络视频流
av_open_input_file();//读取文件头部把信息保存到AVFormatContext结构体
av_find_stream_info();//为pFormatCtx->streams填充上正确的信息
CODEC_TYPE_VIDEO;//通过判断得到视频流类型
avcodec_find_decoder();//查找解码器
avcodec_open();//打开编解码器
avcodec_alloc_frame();//分配空间保存帧数据
av_read_frame();//不断从流中提取帧数据
avcodec_decode_video();//解码视频流
avcodec_close();//关闭解码器
avformat_close_input_file();//关闭输入文件

FFmpeg解码的流程图

FFmpeg学习(一)概念_第1张图片

视频播放器原理

视频播放器播放一个互联网上的视频文件,需要经过以下几个步骤:解协议,解封装,解码视音频,视音频同步。如果播放本地文件则不需要解协议,为以下几个步骤:解封装,解码视音频,视音频同步。他们的过程如图所示。

                                                                         FFmpeg学习(一)概念_第2张图片

解协议的作用,就是将流媒体协议的数据,解析为标准的相应的封装格式数据。视音频在网络上传播的时候,常常采用各种流媒体协议,例如HTTP,RTMP,或是MMS等等。这些协议在传输视音频数据的同时,也会传输一些信令数据。这些信令数据包括对播放的控制(播放,暂停,停止),或者对网络状态的描述等。解协议的过程中会去除掉信令数据而只保留视音频数据。例如,采用RTMP协议传输的数据,经过解协议操作后,输出FLV格式的数据。

解封装的作用,就是将输入的封装格式的数据,分离成为音频流压缩编码数据和视频流压缩编码数据。封装格式种类很多,例如MP4,MKV,RMVB,TS,FLV,AVI等等,它的作用就是将已经压缩编码的视频数据和音频数据按照一定的格式放到一起。例如,FLV格式的数据,经过解封装操作后,输出H.264编码的视频码流和AAC编码的音频码流。

解码的作用,就是将视频/音频压缩编码数据,解码成为非压缩的视频/音频原始数据。音频的压缩编码标准包含AAC,MP3,AC-3等等,视频的压缩编码标准则包含H.264,MPEG2,VC-1等等。解码是整个系统中最重要也是最复杂的一个环节。通过解码,压缩编码的视频数据输出成为非压缩的颜色数据,例如YUV420P,RGB等等;压缩编码的音频数据输出成为非压缩的音频抽样数据,例如PCM数据。

视音频同步的作用,就是根据解封装模块处理过程中获取到的参数信息,同步解码出来的视频和音频数据,并将视频音频数据送至系统的显卡和声卡播放出来。

 

 

 

 

 

 

ffmpeg的主要工作流程相对比较简单,具体如下:
1)解封装
2)解码
3)编码
4)封装
其中需要经过6个步骤,具体如下:
1)读取输入源
2)进行音视频的解封装
3)解码每一帧音视频数据
4)编码每一帧音视频数据
5)进行音视频的重新封装
6)输出到目标

参考1:https://blog.csdn.net/yao_hou/article/details/80559161

FFmpeg学习(一)概念_第3张图片

 

你可能感兴趣的:(音视频)