FFmpeg是一个开源免费跨平台的视频和音频流方案,属于自由软件,采用LGPL或GPL许可证(依据你选择的组件)。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库libavcodec,为了保证高可移植性和编解码质量,libavcodec里很多codec都是从头开发的。
FFmpeg框架的基本组成包含:
- 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)编码,需要使用x265编码器;MP3(mp3lame)编码,需要使用libmp3lame编码器。如果希望增加自己的编码格式,或者硬件编解码,则需要在AVCodec中增加相应的编解码模块 - AVFilter
AVFilter库提供了一个通用的音频、视频、字幕等滤镜处理框架。在AVFilter中,滤镜框架可以有多个输入和多个输出。 - AVDevice
读取电脑(或者其他设备上)的多媒体设备的数据 或者输出数据到指定的多媒体设备上; - AVUtil
包含一些公共的工具函数,包括随机数生成、数据结构、核心多媒体工具等; - swscale
swscale模块提供了高级别的图像转换API,例如它允许进行图像缩放和像素格式转换,常见于将图像从1080p转换成720p或者480p等的缩放,或者将图像数据从YUV420P转换成YUYV,或者YUV转RGB等图像格式转换。 - swresample
用于音频采样采样数据(PCM)转换的库,提供了高级别的音频重采样API。
主要的工具集:
- ffmpeg:一个命令行工具,可用于格式转换、解码、编码等;
- ffsever:一个 HTTP 、RTSP的实时广播流媒体服务器;
- ffplay:是一个简单的播放器,使用ffmpeg 库解析和解码,通过SDL显示;
- ffprobe : 一个多媒体流分析工具。 它从多媒体流中收集信息 并且以人类和机器可读的形式打印出来。
ffmpeg的主要工作流程相对比较简单,具体如下:
- 解封装(Demuxing)
- 解码(Decoding)
- 编码(Encoding)
- 封装(Muxing)
其中需要经过6个步骤,具体如下:
- 读取输入源
- 进行音视频的解封装
- 解码每一帧音视频数据
- 编码每一帧音视频数据
- 进行音视频的重新封装
- 输出到目标
ffmpeg整体处理的工作流程与步骤为:
读取文件 → 解封装 → 解码 → 转换参数 → 新编码 → 封装 → 写入文件
ffmpeg首先读取输入源;
然后通过Demuxer将音视频包进行解封装,这个动作通过调用libavformat中的接口即可实现;
接下来通过Decoder进行解码,将音视频通过Decoder解包成为YVU或者PCM这样的数据,Decoder通过libavcodec中的接口即可实现;
然后通过Encoder将对应的数据进行编码,编码可以通过libavcodec中的接口来实现; 接下来将编码后的音视频数据包通过Muxer进行封装,Muxer封装通过libavformat中的接口即可实现,输出成为输出流。
- 邮箱 :[email protected]
- Good Luck!