1、FFmpeg
FFmpeg 强大专用于处理音视频的开源库,包含了先进的音视频编解码库,提供了录制、转换以及流传输音视频的完整跨平台解决方案。既可以使用它的API对音视频进行处理,也可以使用它提供的工具,如 ffmpeg, ffplay, ffprobe,来编辑音视频文件。
开源代码
https://github.com/FFmpeg/FFmpeg
特点
功能完整:FFmpeg是领先的多媒体框架,能够解码(decode)、编码(encode)、转码(transcode)、复用(mux)、解复用(demux)、流(stream)、过滤(filter)和播放(play)人类和机器创建的几乎所有内容。
几乎支持所有格式:FFmpeg支持最模糊的古代格式直至最前沿。无论是由某些标准委员会、社区还是公司设计的。
跨平台高度可移植性:FFmpeg可以在各种构建环境:机器体系结构和配置下,跨Linux、Mac OS X、Microsoft Windows、BSD、Solaris等编译,运行并通过测试基础架构 FATE。
每日更新的文档:各种在线每晚更新一次,并且对应于最新的FFmpeg版本。
2、FFmpeg播放流程及相关术语
2.1 播放流程:
video.avi(Container) -> 打开得到 Video_Stream -> 读取Packet -> 解析到 Frame -> 显示Frame。
2.2.1 「封装格式(Container Format)」
封装格式(Container Format),可看作是编码流(Stream)(音频、视频等)数据的一层外壳,将编码后的数据,存储于此封装格式的文件之内。
封装又称容器(Container),容器的用词更为形象。容器就是存放内容的器具。例如:饮料是内容,那么装饮料的瓶子就是容器。对视频来说,封装格式是MP4、AVI、MKV、RMVB等格式。
2.2.2 「流(Stream)」
流(Stream)是一种音视频数据信息的传输方式。有五种流:视频流(Video Stream)、音频流(Audio Stream)、字幕(Subtitle)、附件(t)、数据(d)。
例如:曾经多年前使用VCD看港片,可以选择粤语或国语声音,是视频文件中存放了两路音频流,可供用户选择其中一路进行播放。
2.2.3 「帧(Frame)」
帧(Frame)本意代表一幅静止的图像。
在流(Stream)中,帧代表最小数据单元,也是编解码器真正处理的最小处理单元。
数字视频处理的帧,通常不是说原始图像,而是被编码器编码后的一个图像。对于视频来说,帧(Frame)是编码器编码后的一个图像;对于音频来说,帧(Frame)是编码器编码后的一个声音
帧(Frame)分为:I帧:关键帧、P帧:预测帧、B帧:双向预测帧。
2.2.4 「编解码(Codec)」
每路音视频流(Stream)都会以帧(Frame)为最小单位,被相应的编/解码器(Codec)进行编码或解码,以实现原始数据和压缩数据之间的相互转换。
编码(Codec)是对原始数据的加工,是对输入源进行处理,然后输出的过程。简单说,就是对图像和声音的压缩方法。视频编码主要有:H263、H264、H265、MPEG系列等。
编码(Codec)其实是编码(COde)和解码(DECode)的合称。CODEC = COde(编码) + DECode(解码)
解码就是把编码后的东西还原为原来的状态。对于视频来说,就是把压缩的图像和声音还原为正常可以播放的图像和声音。
编码可以改变文件格式,或者文件格式不变,只更改其他数据。FFmpeg编解码是基于比特流进行的。
2.2.5 「数据包(Packet)」
数据包(Packet)是从流(Stream)中读取的原始Raw数据片段,这些数据片段中,包含的是解码后能被应用程序处理的原始帧(Raw Frame)数据。[12]
分开的数据流在送往编解码器(Codec)处理之前,要先放于缓存中,添加一些附属信息(例如:打上时间戳)以便后续处理,这个缓存空间就是数据包(Packet);由于数据流是在时间轴上交错放置,所有的视频、音频、字幕都被分割成一段一段的数据,这些一段段的数据从数据流中解析出来之后,就是存放在各自的数据包(Packet)。
单纯的视频数据包来说&