Skip to content

Latest commit

 

History

History
60 lines (44 loc) · 3.76 KB

1.FFmpeg简介.md

File metadata and controls

60 lines (44 loc) · 3.76 KB

1.FFmpeg简介

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中的接口即可实现,输出成为输出流。