• 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章


  • 相关阅读:
    获取url中的参数
    css 实现单行以及多行文本溢出显示省略号
    页面跳转不带 referrer的方法
    iframe加载完成事件
    es6模块化规则(一)
    kindle电子书下载网站收藏
    vue多页面项目配置
    使用原生ajax及其简单封装
    在vue中使用jq或者第三方插件
    写博客常用语法
  • 原文地址:https://www.cnblogs.com/linuxAndMcu/p/12039546.html
Copyright © 2020-2023  润新知