4.1 FFmpeg

FFmpeg介绍

FFmpeg是一个完整的,跨平台的解决方案,记录,转换和流音频和视频

FFmpeg是领先的多媒体框架,能够解码、编码、转换代码、mux、demux、stream、filter和play几乎所有人类和机器所创建的东西。它支持多种格式,无论它们是由某个标准委员会、社区或公司设计的。它也是高度可移植性的:FFmpeg编译、运行,并通过Linux、Mac OS X、Microsoft Windows、BSDs、Solaris等在各种各样的构建环境、机器架构和配置下测试基础设施的命运。

FFmpeg可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库libavcodec。

FFmpeg在Linux平台下开发,但它同样也可以在其它操作系统环境中编译运行,包括Windows、Mac OS X等。这个项目最早由Fabrice Bellard发起,2004年至2015年间由Michael Niedermayer主要负责维护。许多FFmpeg的开发人员都来自MPlayer项目,而且当前FFmpeg也是放在MPlayer项目组的服务器上。项目的名称来自MPEG视频编码标准,前面的"FF"代表"Fast Forward"。

FFmpeg组件

它包含libavcodec、libavutil、libavformat、libavfilter、libavdevice、libswscale和libswresample,这些都可以应用于应用程序。以及ffmpeg, ffplay和ffprobe,可以被终端用户用来进行编码和播放,如图4-1。
图4-1

  • libavutil是一个包含简化编程功能的库,包括随机数生成器、数据结构、数学例程、核心多媒体实用程序等等。
  • libavcodec是一个包含解码和编码器的音频/视频编解码器的库。
  • libavformat是一个包含用于多媒体容器格式的demuxers和muxers的库。
  • libavdevice是一个包含输入和输出设备的库,用于抓取和呈现许多常见的多媒体输入/输出软件框架,包括Video4Linux、Video4Linux2、VfW和ALSA。
  • libavfilter是一个包含媒体过滤器的库。
  • libswscale是一个执行高度优化的图像缩放和颜色空间/像素格式转换操作的库。
  • libswresample是一个执行高度优化的音频重采样、rematrixing和示例格式转换操作的库。
  • libpostproc是一个用于后期效果处理的库。

所支持的协议

HTTP、RTP、RTSP、RealMedia RTSP/RDT、TCP、UDP、Gopher、RTMP、RTMPT、RTMPE、RTMPTE、RTMPS、SDP、MMS over TCP

示例

转码一个视频码率为4M

ffmpeg -i input.avi -b 4M output.avi

转码一个视频24帧

ffmpeg -i input.avi -r 24 output.avi

转码流程

 _______              ______________
|       |            |              |
| input |  demuxer   | encoded data |   decoder
| file  | ---------> | packets      | -----+
|_______|            |______________|      |
                                           v
                                       _________
                                      |         |
                                      | decoded |
                                      | frames  |
                                      |_________|
 ________             ______________       |
|        |           |              |      |
| output | <-------- | encoded data | <----+
| file   |   muxer   | packets      |   encoder
|________|           |______________|
  1. ffmpeg调用libavformat库(包含demuxers)来读取输入文件并获取包含编码数据的数据包
  2. 将编码的信息包传递给解码器
  3. 解码器产生未压缩的帧,可以通过过滤进一步处理
  4. 过滤后,帧被传递给编码器,编码器编码它们并输出编码的数据包
  5. 最后,这些被传递给muxer,它将编码的包写入输出文件。

results matching ""

    No results matching ""