FFmpeg收获总结(一)--学习FFMPEG之前必须要理解的东西

qi.wei

发布于 2020.02.08 01:54 阅读 2700 评论 0

FFmpeg收获总结(一)--学习FFMPEG之前必须要理解的东西

 

文章分为以下几个部分:

 

   1.前言

   2.封装格式

   3.码流格式

   4.像素格式

   5.音频采样格式

   6.视频播放器原理

   7.音频解码

   8.视频解码

   9.总结

 

 

 

 

前言

 

   FFmpeg是什么?FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。它提供了强大的视频采集功能、视频转码功能、视频处理功能等,它几乎囊括了现存所有的视音频编码标准并且还是开源的,只要是深入多媒体影音领域的人基本都必须要认识它。

      不过FFmpeg对于新手来说并不容易入门,因为它的代码复杂逻辑复杂,所牵扯到的知识也比多。对于新手来说不建议直接研究网上写的一些FFmpeg播放器的demo,直接研究代码可能只会研究明白大体的步骤,但是具体的细节会无法理解。建议先搞明白视频播放器的原理,再简单研究代码,再搞明白FFmpeg中那些结构体和那些函数的作用,然后再深入研究代码。

接下来首先会介绍几种格式,再介绍原理,因为这几种格式就是视频文件从打开到播放需要经历的几种状态。

 

 

 

封装格式

 

   什么是封装格式?其实封装格式是我们平时最容易接触到的格式,像:mp4、avi、flv等等,我们看视频的时候,先把视频文件下载到电脑上,下载的那个文件就是封装格式的文件。

       下面有一个表详细介绍了几种常见的封装格式:

      为什么要叫它封装格式呢?那是因为在封装格式里面封装了多种码流格式数据,例如视频流和音频流等。

 

 

 

码流格式

 

      码流格式常见的有视频流、音频流,当然也还有其他的,不过我暂时也没有接触到。

为什么叫做码流格式呢?是因为码流数据是由原始数据编码之后得到的数据,编码就相当于压缩,但是为什么要压缩呢?是因为原始数据特别占存储空间,可能一个普通的电影只按原始数据存的话要几百上千G的存储空间,这样的话看个电影的代价就太大了。这里所提到的原始数据,就是能够让硬件直接显示或者播放的数据,例如视频流压缩前是像素数据,音频流压缩前是音频采样数据。

 

 

 

像素格式

 

    像素数据就是由视频流解码得到的数据。常见的像素格式有RGB格式和YUV格式。

RGB可能大家都清楚就是3原色嘛,R代表红色,G代表绿色,B代表蓝色,这三种颜色相互组合能够生成自然界所有的颜色。RGB格式的数据是屏幕能够直接识别的数据。

    YUV之前没有听说过,但是这个格式也非常重要。YUV这种格式的兴起是因为科学研究表明人对色度不是特别敏感,但是对亮度比较敏感,所以Y分量用来保存亮度信息,UV分量用来保存色度信息,因为人对亮度敏感所以Y分量是保存了整一帧画面各个像素的亮度,人对色度不敏感所以UV分量保存数据的时候不是每个像素点都保存的,而是隔一个保存一个,这样宽高都是原来的1/2面积就变成了原来的1/4这样又极大的压缩了数据资源的大小。

 

 

 

音频采样格式

 

    音频采样数据是由音频流解码得到的数据。常见的音频采样格式有PCM等。

    PCM数据包含音频的频率一般为44100赫兹,当然也有其他的赫兹数,不过大多数是44100,在用SDL播放音频采样数据的时候就需要设置音频的频率,设置的时候根据情况而定是44100的就设置成44100,是48000的就设置成48000,设置错了的话音频可能会出现噪声。

 

 

 

视频播放器原理

 

    一个本地的视频文件,从打开到播放大概要经历这么几个流程:解封装—音频解码、视频解码-视音频同步,如果是播放在线的视频,还需要进行解协议,解协议在直播系统中收流步骤将会运用到。

    下图是视频播放的详细流程:

 

    之前介绍了几种不同的格式:封装格式、码流格式、像素格式、音频采样格式。上图中解协议得到的(或者本地的视频文件)就是封装格式的数据;封装格式解封装得到的是码流数据,也就是上图中的音频压缩数据和视频压缩数据,音频压缩数据和视频压缩数据是分开进行处理的;音频压缩数据解码之后的到的是音频原始数据;视频压缩数据解码之后的到的是视频原始数据;为了让视频播放的时候,画面能够和声音同步,还需要进行视音频同步的操作,同步之后再分别显示或播放到硬件之上。

 

 

 

音频解码

 

      解封装得到音频流之后,音频流是一种编码后的格式是不能直接播放的,所以需要对音频流进行解码(在FFmpeg中音频流解码前还需要查找解码器,并且解码之前是先取音频流的一帧,然后进行解码),编码解码都要遵循特定的规则,目前主要用到的是ACC编码,详细的音频编码信息请看下图:

 

 

 

视频解码

 

    解封装得到视频流之后,视频流也是需要解码的(在FFmpeg中视频流解码前还需要查找解码器,并且解码之前是先取视频频流的一帧,然后进行解码),目前主要用到的是H.264编码,详细的视频编码信息请看下图:

 

 

 

总结

 

    到这里对视频播放器的原理应该就有了大致的了解了,在学习ffmpeg之前我以为视频里面的画面和声音就是一体的,像之前用QT自带的QMediaPlayer写视频播放器,直接player->play()视频画面和声音就播放了,学习之后才发现这中间还有这么多门道,有视频流、音频流,还需要解码。学习ffmpeg之后也是对多媒体影音世界有了新的认识。