写点什么

FFmpeg 入门篇

用户头像
Changing Lin
关注
发布于: 2021 年 03 月 19 日
FFmpeg入门篇

一、背景

本文的标题其实起的不是很贴切,因为按照原先的计划,编写文章的目的是为了构建音视频知识体系,但是又绕不过 FFmepg,所以才起了这样一个标题。


  • 熟悉音视频方向,专业名词,基础概念,理论基础

  • 对 ffmpeg 有一个感性认识

  • 基于 ffmpeg 做一些功能开发,加深对音视频的理解,编解码,图像格式,矩阵变换,混合,参数含义,容器,水印,转码


二、专业名词介绍

1、人耳所能听到的声音的频段为:

20HZ-20KHZ,16 位-96dB 的信噪比,线性脉冲编码调制 PCM,采样速率 40~50KHZ

香农采样定理,又称奈奎斯特采样定理,为了不失真地恢复模拟信号,采样频率应该不小于模拟信号频谱中最高频率的 2 倍。  fs ≥ 2fmax


2、音视频方向两大标准制定组织:



3、容器和协议

3.1、容器格式和编码格式

  • 文件是既包括视频又包括音频、甚至还带有脚本的一个集合,也可以叫容器;容器格式即 文件格式

  • 文件当中的视频和音频的压缩算法才是具体的编码格式

  • 例如:一个.avi 文件,当中的视频可能是编码 a,也可能是编码 b,音频可能是编码 5,也可能是编码 6,具 体的用那种编码的解码器,则由播放器按照 avi 文件格式读取信息去调用了。

3.2、常见的音频视频编码有以下几类:

  • MPEG 系列:(由 ISO 下属的 MPEG[运动图象专家组]开发 )

视频编码方面主要是 Mpeg1(vcd 用的就是它)、Mpeg2(DVD 使用)、Mpeg4(现在的 DVDRIP 使用的都是它

的变种,如:divx,xvid 等)、Mpeg4 AVC(现在正热门);

音频编码方面主要是 MPEG Audio Layer 1/2、MPEG Audio Layer 3(大名鼎鼎的 mp3)、MPEG-2 AAC 、MPEG-4

AAC 等等。 注意:DVD 音频没有采用 Mpeg 的

  • H.26X 系列:(由 ITU 主导,侧重网络传输,注意:只是视频编码)

包括 H261、H262、H263、H263+、H263++、H264(就是 MPEG4 AVC-合作的结晶)

  • 其他如:微软 windows media 系列、RealMedia 系列、QuickTime 系列

3.3、视频协议(两大类)

视频压缩协议有:h.261、h.263、h.264 和 mpeg-1、mpeg-2 和 mpeg-4

从应用的角度看,mpeg 系列在消费类应用更广些,用来做存储协议是很合适的;从技术角度说,h 系列的协议对网络的支持更好些

3.4、音频协议(两大类)

itu:g.711、g.722、g.723、g.726、g.728、g.729 等;第一是比较关注语音压缩,第二是压缩率都比较大,码率都比较低

iso : mp3,它的全称是 mpeg-1 audio layer 3,意思是 mpeg-1 的音频第三层;最新的音频算法被称为 aac(也称为 mp4),它定义在 mpeg-2 或 mpeg-4 的音频部分。音质好,支持多声道,高采样精度和采样频率,尤其对音乐的压缩效果比 g 系列要好太多。

3.5、上层通讯协议

  • 视频会议系统中,目前最流行的有 h.323 和 sip 协议,

  • 在流媒体应用中,rtsp、rtmp、hls、srt 应用得比较多,它属于开源项目,

  • 很多流媒体产商有自己的流媒体传输协议,比如微软的 mms 等

  • h.323 和 sip 分别是通信领域与因特网两大阵营推出的建议,h.323 企图把 ip 电话当作是众所周知的传统电话,只是传输方式发生了改变,由电路交换变成了分组交换;而 sip 协议侧重于将 ip 电话作为因特网上的一 个应用,比其他应用(如 ftp,e-mail 等)增加了信令和 qos 的要求,它们支持的业务基本相同,也都利用 rtp 作为媒体传输的协议

  • rtsp:典型的应用就是网络电视的应用,点播、监控行业


三、常用概念

1、硬解

  • 软解:就是通过软件让 CPU 进行视频解码处理;

  • 硬解:指不依赖于 CPU,通过专用的设备(子卡)单独完成视频解码

- 硬解主要依靠解码芯片,解码芯片的性能是有局限的, 类似于汽车的发动机功率是有极限的. 它能够流畅解码的数据,主 要受限于以下几个参数和条件

2、IBP 帧

2.1 基本概念

  • P frame: 前向预测编码帧 又称 predictive-frame,通过充分将低于图像序列中前面已编码帧的时间冗余信息来压缩传输数据量的编码图像,也叫预测帧;

  • B frame: 双向预测内插编码帧 又称 bi-directional interpolated prediction frame,既考虑与源图像序列前面已编码帧,也顾及源图像序列后面已编码帧之间的时间冗余信息来压缩传输数据量的编码图像,也叫双向预测帧;

2.2 IBP 帧特点(I、B、P 各帧是根据压缩算法的需要,是人为定义的,它们都是实实在在的物理帧,至于图像中的哪一帧是 I 帧,是随机的,一但确定了 I 帧,以后的各帧就严格按规定顺序排列)

  • I 帧特点:

1.它是一个全帧压缩编码帧。它将全帧图像信息进行 JPEG 压缩编码及传输;2.解码时仅用 I 帧的数据就可重构完整图像;3.I 帧描述了图像背景和运动主体的详情;4.I 帧不需要参考其他画面而生成;5.I 帧是 P 帧和 B 帧的参考帧(其质量直接影响到同组中以后各帧的质量);6.I 帧是帧组 GOP 的基础帧(第一帧),在一组中只有一个 I 帧;7.I 帧不需要考虑运动矢量;8.I 帧所占数据的信息量比较大。
复制代码
  • P 帧:前向预测编码帧

P 帧的预测与重构:P 帧是以 I 帧为参考帧,在 I 帧中找出 P 帧“某点”的预测值和运动矢量, 取预测差值和运动矢量一起传送。在接收端根据运动矢量从 I 帧中找出 P 帧“某点”的预测值并与差值相加以得到 P 帧“某点”样值,从而可得到完整的 P 帧1.P 帧是 I 帧后面相隔 1~2 帧的编码帧;2.P 帧采用运动补偿的方法传送它与前面的 I 或 P 帧的差值及运动矢量(预测误差);3.解码时必须将 I 帧中的预测值与预测误差求和后才能重构完整的 P 帧图像;4.P 帧属于前向预测的帧间编码。它只参考前面最靠近它的 I 帧或 P 帧;5.P 帧可以是其后面 P 帧的参考帧,也可以是其前后的 B 帧的参考帧;6.由于 P 帧是参考帧,它可能造成解码错误的扩散;7.由于是差值传送,P 帧的压缩比较高
复制代码
  • B 帧:双向预测内插编码帧

B 帧的预测与重构:B 帧以前面的 I 或 P 帧和后面的 P 帧为参考帧,“找出”B 帧“某点”的预测值和两个运动矢量,并取预测差值和运动矢量传送。接收端根据运动矢量在两个参考帧中“找出(算出)”预测值并与差值求和,得到 B 帧“某点”样值,从而可得到完整的B帧1.B 帧是由前面的 I 或 P 帧和后面的 P 帧来进行预测的;2.B 帧传送的是它与前面的 I 或 P 帧和后面的 P 帧之间的预测误差及运动矢量;3.B 帧是双向预测编码帧;4.B 帧压缩比最高,因为它只反映丙参考帧间运动主体的变化情况,预测比较准确;5.B 帧不是参考帧,不会造成解码错误的扩散
复制代码

3、GOP(Group of Picture,画面组)

GOP(Group of Pictures)策略影响编码质量:所谓 GOP,意思是画面组,一个 GOP 就是一组连续的画面。MPEG 编码将画面(即帧)分为 I、P、B 三种,I 是内部编码帧,P 是前向预测帧,B 是双向内插帧;I 帧是一个完整的画面,而 P 帧和 B 帧记录的是相对于 I 帧的变化。

MPEG-2 压缩的帧结构有两个参数,一个是 GOP(Group Of Picture)图像组的长度,一般可按编码方式从 1-15;另一个是 I 帧和 P 帧之间 B 帧的数量,一般是 1-2 个。前者在理论上记录为 N,即多少帧里面出现一次 I 帧;后者描述为多少帧里出现一次 P 帧,记录为 M;

4、mpeg4 视频中 IBP 的判定

mpeg4 的每一帧开头是固定的:00 00 01 b6,那么我们如何判断当前帧属于什么帧呢;根据接下来的 2bit 可以判断帧类型:00: I Frame,01: P Frame,10: B Frame

为了更好地说明,我们举几个例子,以下是 16 进制显示的视频编码:

00 00 01 b6 10 34 78 97 09 87 06 57 87 …… I 帧00 00 01 b6 50 78 34 20 cc 66 b3 89 …… P 帧00 00 01 b6 96 88 99 06 54 34 78 90 98 …… B 帧
复制代码

下面我们来分析一下为什么他们分别是 I、P、B 帧

0x10 = 0001 00000x50 = 0101 00000x96 = 1001 0100
复制代码

下面给出一段代码参考:

switch (buf[i] & (byte) 0xc0) { // 0xc0 ==> 1100 0000b            case 0x00://I Frame                break;            case 0x40://P Frame                break;            case 0x80://B Frame                break;            default:                break;        }
复制代码

5、DTS 和 PTS

  • PTS: Presentation Time Stamp。PTS 主要用于度量解码后的视频帧什么时候被显示出来

  • DTS: Decode Time Stamp。DTS 主要是标识读入内存中的 bit 流在什么时候开始送入解码器中进行解码。

6、分辨率(指两个概念)

  • 物理分辨率, 即手机屏幕能显示的像素数,用 W x H 个像素表示。常见的手机屏幕分辨率为 320x240(QVGA), 随着大屏幕手机的普及, 更高的分辨率也开始出现. 例如: 480x320(iphone),640x360(nHD, 诺基亚触屏系列常见),640x480(VGA, 多普达系列常见), 甚至高达 852x480(夏普高端手机常见).

  • 视频文件的分辨率, 这个是指视频画面的实际分辨率, 如, 320x240, 480x272, 640x480 等等。一般来说,大部分手机的解码芯片不支持超过其屏幕物理分辨率的视频, 部分可以支持超过其屏幕物理分辨率的视频, 例如, 虽然 iphone 的屏幕物理分辨率为 480x320, 但它支持 640x480 的视频, 此时播放的画面实际是把原视频缩小的

7、码率

一般用多少 kbps(千比特/秒)或者 mbps(兆比特/秒)来表示。 手机解码芯片所支持的码率一般都在 1Mbps 以下

8、帧率


(FPS, 帧/秒), 就是视频画面刷新的速度, 作为参考, 国内电视机一般是 25FPS, 电影标准为 24FPS. 手机芯片,最高支持 30FPS, 早期型号最大只能 15fps。

9、RGB 和 YUV


RGB 指的是红绿蓝,应用还是很广泛的,比如显示器显示,bmp 文件格式中的像素值等;

10、实时与非实时

主要用来形容编码器,它含有两个意思,一个是要保证帧率,也就是每秒 25 帧,另一个是“live”的意思,意味着直播,所谓的“实况转播”的“实”

11、复合视频和 s-video

12、硬件加速

13、FFmpeg Device

四、FFmpeg 框架

  • Fabrice Bellard (法国著名程序员 Born in 1972)于 2000 年发起创建的开源项目

  • 官网:https://www.ffmpeg.org/ 最新版本:FFmpeg 4.2 "Ada"

  • 功能:视频采集功能、视频格式转换、视频抓图、给视频加水印

  • 媒体播放器三大底层框架:MPC、MPlayer 和 VLC

  • 架构图如下:


结论:ffmpeg 处于中间框架层的位置;应用层可以调用 ffmpeg API 来读写媒体文件;也可以调用下层编解码器等外部库用来实现编解码,获取原生图像和音频数据;

  • FFmpeg 相关数据结构:


结论:ffmpeg 对媒体文件处理流程:解协议->解封装->解码->存数据;读数据->编码->填容器->添加协议;


五、总结

本文主要介绍音视频开发领域的部分专业名词和常用概念(音频还未涉及),以及介绍 FFmpeg 在整个平常音视频开发领域的定位。基本上如果要开发一个播放器,要支持多种编解码格式、多种容器格式和多种协议类型,那么 ffmpeg 是最好的选择。但是 ffmpeg 本身仅作为命令行工具或类库(常见的如 libavcodec)出现。终端用户很少能直接接触到 ffmpeg,所以知名度也较小。但我们应该知道,音视频开发领域不仅仅是围绕 FFmpeg,还有很多应用场景,如视频会议、流媒体传输、直播、美颜、人脸识别,图像处理,图像处理等等。


发布于: 2021 年 03 月 19 日阅读数: 26
用户头像

Changing Lin

关注

获得机遇的手段远超于固有常规之上~ 2020.04.29 加入

我能做的,就是调整好自己的精神状态,以最佳的面貌去面对那些未曾经历过得事情,对生活充满热情和希望。

评论

发布
暂无评论
FFmpeg入门篇