音视频基础知识

Android 音视频开发的难度相对较高,音视频开发中很多有特色的或者核心的模块使用 NDK 开发,而 NDK 开发又主要使用 C/C++ 语言编写代码 ,这对于使用 Java 语言的 Android 开发者来说有门槛。音视频应用从业方向;算法方向,工程方向。


音视频基础知识

如图所示,这是一个 MP4 的视频文件的属性,可以看到在更多信息栏里编解码器有 AAC、H.264,这个就是视频的音频编码和视频编码,而 MP4 其实就是封装协议。

一般情况下,视频流从加载都准备播放是需要经过解协议、解封装、解编码这样的过程,其中协议指的就是流媒体协议;封装指的是视频的封装格式,封装格式数据就是个容器,可以存多个视频流;编码又分为视频编码和音频编码

协议一般有 HTTP 、RTSP、RTMP 等,最常见的就是 HTTP 网络协议,而 RTSP 和 RTMP 一般用于直播流或常见于支持带有控制信令的,比如远程监控。

相关知识点

帧率(Frame Rate):每秒显示帧数(frames per second,简称 fps)或 ”赫兹“(Hz)。表示图形处理器处理场时每秒能够更新的次数。高帧率可以得到更流畅、更逼真的动画。

分辨率:指视频成像产品所形成的图像大小或尺寸。

刷新率:指屏幕每秒画面被刷新的次数,分为垂直刷新率和水平刷新率,一般提到的刷新率通常指垂直刷新率。垂直刷新率表示屏幕上图像每秒重绘多少次,也就是每次屏幕刷新的次数,以 Hz 为单位。刷新率越高,图像就越稳定,图像显示就越自然清晰,对眼睛的影响也越小。刷新率越低,图像闪烁和抖动得就越厉害,眼睛疲劳得就越快。一般来说,如果能达到 80Hz 以上的刷新率,就可以完全消除图像闪烁和抖动感,眼睛也不太容易疲劳。

编码的格式:编码的目的是压缩数据量,采用编码算法压缩冗余数据。常用的编码格式有如下两种:

  • MPEG(MPEG-2、MPEG-4)
  • H.26X(H.263、H.264/AVC、H.265/HEVC)

封装格式:把编码后的音视频数据以一定格式封装到一个容器,封装格式有 MP4、MKV、AVI、TS 等。

码率:也就是比特率,比特率是单位时间播放连续的媒体(如压缩后的音频或视频)的比特数量。比特率越高,带宽消耗的越多。比特(bit)就是二进制里面最小的单位,要么是 0,要么是 1。

  • 文件大小(b)= 码率(b/s)x 时长(s)

画质与码率:实际上视频质量和码率、编码算法都有关系,并不是码率越大,画质越好,视频越流畅。

量化精度:表示可以将模拟信号分成多少个等级,量化精度越高,音乐的声压振幅越接近原音乐。量化精度的单位是 bit(比特),CD 标准的量化精度是 16bit,DVD 标准的量化精度是 24bit。也可理解为一个采样点用多少 bit 表示(8/16/24/32bit)。

采样率:指每秒音频采样点个数(8000/44100Hz),采样率单位用 Hz(赫兹)表示。

声道:指声音在录制或播放时在不同空间位置采集或回收的相互独立的音频信号,所以声道数也就是声音录制时的音源数量或回收时相应的扬声器数量。常见的有单声道、立体声道、4 声道、5.1 声道、7.1 声道等。

数字音频

模拟信号:是大自然内的声音。指用连续变化的物理量表示的信息。

数字信号:是在模拟信号的基础上进行采样、量化和编码。

  • 采样:在时间轴上对信号进行数字化。如一般的 44.1kHz(奈奎斯特定理)就是代表 1 秒会采样 44100 次。
  • 量化:在幅度轴上对信号进行数字化,具体的每个采样的表示。
  • 编码:按照一定的格式记录采样和量化后的数字数据,比如顺序存储或压缩存储等。

编码的目的,就是压缩数据。核心思想就是去除冗余信息。

  • 使用帧间编码技术可以去除时间上的冗余信息,具体包含以下几个部分:
    • 运动补偿:通过先前的局部图像来预测、补偿当前的局部图像,它是减少帧序列冗余信息的有效方法。
    • 运动表示:不同区域的图像需要使用不同的运动矢量来描述运动信息。
    • 运动估计:从视频序列中抽取运动信息的一整套技术。
  • 使用帧内编码技术可以去除空间上的冗余信息。

音频编码

音频编码指的是音频数据的编码方式,常见的音频编码格式有:

  • WAV / PCM: 编码的音频质量比较好,但是体积会比较大。PCM(Pulse Code Modulation)数据:脉冲编码调制,也就是音频的裸数据格式。描述一段 PCM 数据一般需要以下几个概念:量化格式(sampleFromat)、采样率(sampleRate)、声道数(channel)。

  • AAC:一种专为声音数据设计的文件压缩格式,属于有损压缩格式,特点是使文件更加小巧。又分 LC-AAC、HE-AAC 等

  • MP3:一种音频有损压缩技术,能在音频质量还可以的情况下压缩音频的体积,被设计用来大幅度地降低音频数据量。特点是利用人耳对高频声音信号不敏感的特性,将时域波形信号转换成频域信号,并划分成多个频段,对不同频段使用不同的压缩率,对高频信号使用大压缩率(甚至忽略信号),对低频信号使用小压缩率。从而将声音用 1:10 甚至 1:12 的压缩率压缩。

    • 时域波形信号:信号随着时间的变化。(时域:时间与振幅的关系)
    • 频域信号:信号在频率方面的特性。(频域:频率与振幅的关系)
  • AC3:有损音频编码格式,被广泛应用于 5.1 声道(Dolby AC3 提供的环绕声系统由 5 个全频域声道和 1 个超低音声道组成)。

图像的数值表示

YUV 与 RGB

通常情况下我们理解的画面是 RGB 组合出来的,而目前视频领域可能更多使用 YUV 格式,YUV 也被称作 YCbCr,是一种对于视频帧的裸数据表示格式,主要应用于优化彩色视频信号的传输,使其向后兼容老式黑白电视。对于 YUV;Y 表示明亮度(灰阶值),即可表示黑白图像,兼容黑白电视。而 UV 表示色度,加上 UV 即可表示彩色图像,彩色电视。并且,可以与 RGB 互转。(还有个 305911 公式)

  • YUV:其应用领域很广泛,JPEG、MPEG 均采用此格式。Android 摄像头,NV21 格式就是 YUV 的一种。YUV 数据排列方式不同,又分为不同的存储格式。在压缩时,由于人眼对亮度敏感,对色度不敏感,所以可以对 Y 少压缩点,对 UV 多压缩点。
  • RGB:是一种颜色空间模型,通过对红(R)、绿(G)、蓝(B)3 个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色,RGB 即代表红、绿、蓝 3 个通道的颜色。

视频编码

视频编码指通过特定的压缩技术,将某个视频格式文件转换成另一种视频格式文件的方式。(画面图像的编码压缩方式)

主要分为两个系列:

  • MPEG 系列:有视频编码和音频编码。
  • H.26X 系列:侧重网络传输,并且只有视频编码。(H.264 是目前比较常见的编码方式,就是 avc。H.265 存在付版权费等问题。)

此外,在互联网上被广泛应用的还有 Real-Networks 的 RealVideo、微软公司的 WMV 以及 Apple 公司的 QuickTime 等。

编码概念

视频帧:视频压缩中,每帧都代表着一副静止的画像,而 IPB 帧是一种常见的帧压缩方法。

  • I 帧:表示关键帧,可以理解为这一帧画面的完整保留,解码时只需要本帧数据就可以完成(因为包含完整画面)。(I 帧压缩可去掉视频的空间冗余信息。接下来的 P/B 帧是为了去掉时间冗余信息。)
  • P 帧:前向预测帧,表示这一帧和之前的一个关键帧(或 P 帧)的差别,解码时需要用之前缓存的画面叠加上本帧定义的差别生成最终画面。(也就是差别帧,P 帧没有完整画面数据,只有与前一帧的画面差别的数据。)
  • B 帧:双向差别帧,也就是 B 帧记录的是本帧与前后帧的差别(具体比较复杂,有 4 种情况),换言之,要解码 B 帧,不仅要取得之前的缓存页面,还要解码之后的画面,通过前后画面数据与本帧数据的叠加取得最终的画面。B 帧压缩率高,但是解码时 CPU 会比较吃力。(提高视频质量的技巧中,还可以多使用 B 帧,B 帧的压缩率更高,能节省大量空间来更多地保存 I 帧,这样就能在相同码率下提供更好的画质。)

IDR 帧:在 H264 的概念中有一个帧称为 IDR 帧,因为 H264 采用了多帧预测,导致 I 帧不能作为独立的观察条件。也就是说 I 帧之后的 P 帧有可能会参考 I 帧之前的帧,这就使得在随机访问的时候不能以找到 I 帧作为参考条件,因为即使找到 I 帧,I 帧之后的帧还是有可能解析不出来,而 IDR 帧就是一种特殊的 I 帧,即这一帧之后的所有参考帧只会参考到这个 IDR 帧,而不会再参考前面的帧。最关键的概念就是:在解码器中, 一旦收到一个 IDR 帧,就会立即清理参考帧缓冲区,并将 IDR 帧作为被参考的帧。

DTS 与 PTS:前者主要用于标示读入内存中的比特流在什么时候开始送入解码器中进行解码(主要用于视频的解码)。后者主要用于度量解码后的视频帧什么时候被显示出来(主要用于在解码阶段对视频进行同步和输出)。

在没有 B 帧的情况下,DTS 与 PTS 的输出顺序是一样的。因为 B 帧打乱了解码和显示的顺序,所以一旦存在 B 帧,PTS 与 DTS 势必就会不同。

GOP(Group Of Picture): 意思是画面组,一个 GOP 就是一组连续的画面(两个 I 帧之间形成的一组图片),也称为两个 I 帧之间的距离(I帧间隔)。GOP 策略影响编码质量, 如果码率固定而 GOP 值(在为编解码器设置参数时,必须要设置 gop_size 的值,其代表的是两个 I 帧之间的帧数目。)越大,P/B 帧数量会越多,画面质量就会越高,而需要解码的时间就会越长。

音频帧:音频帧的概念没有视频帧那么清晰,几乎所有视频编码格式都可以简单地认为 I 帧就是编码后的一幅图像。但音频帧跟编码格式相关,它是各个编码标准自己实现的。

  • 对 PCM(未经编码的音频数据)来说,它根本就不需要帧的概念,根据采样率和采样精度就可以播放。
  • AMP 帧,规定每 20ms 的音频是一帧,每一帧音频都是独立的,有可能采用不同的编码算法以及不同的编码参数。
  • MP3 帧,音频数据帧个数由文件大小和帧长决定,每一帧的长度可能不固定,也可能固定,由比特率决定,每一帧又分为帧头和数据实体两部分,帧头记录了 MP3 的比特率、采样率、版本等信息,每一帧之间相互对立。

多媒体播放组件

Android 多媒体播放组件包含:

  • MediaPlayer:播放控制。
  • MediaCodec:音视频编解码。
  • OMX:多媒体部分采用的编解码标准。
  • StageFright:一个替代 OpenCore 的框架,主要做了一个 OMX 层,仅仅对 OpenCore 的 omx-component 部分做了引用。
  • AudioTrack:音频播放

IOS 多媒体播放组件包含:VideoToolBox、AudioToolBox、AVPlayer。

常见的多媒体框架及解决方案

常见的多媒体框架及解决方案有:

  • VLC:即 Video LAN Client ,是一款自由、开源的跨平台多媒体播放器及框架。

  • FFmpeg:多媒体解决方案,不是多媒体框架,广泛用于音视频开发中。

  • GStreamer:一套构建流媒体应用的开源多媒体框架。


备注

参考资料

《Android 音视频开发》

《音视频开发进阶指南》

移动开发者的音视频基础知识

欢迎关注微信公众号:非也缘也

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值