突然想学习Android音视频领域,所以在网上找博客看,遇见了上面这篇博客,通读了一遍,写的真好。又翻看了作者其它的博客,很厉害。

淡泊明志 宁静致远

虽然作者已经写的很好了,但我还是想参考作者的再写一遍,一来是关注点不一样,二来是由于我的学习方法——费曼学习法。

1.音视频基础知识
1.1 封装格式与视音频编码标准

我们会见到各种各样的视频格式,mp4,rmvb,mkv,avi等等许多格式,这些都被称为封装格式。封装格式就是就是把视频数据和音频数据打包成一个文件的规范,这很容易理解,对内容封装的格式。

封装格式封装了视频数据与音频数据,因为一部视频既要又画面也要有声音。当然,视频数据与音频数据也要有自己的编码格式。

视频编码的主要作用是将视频像素数据(RGB,YUV等)压缩成为视频码流,从而降低视频的数据量。如果视频不经过压缩编码的话,体积通常是非常大的,一部电影可能就要上百G的空间。视频编码是视音频技术中最重要的技术之一。视频码流的数据量占了视音频总数据量的绝大部分。高效率的视频编码在同等的码率下,可以获得更高的视频质量。

视频编码格式一览

名称

推出机构

推出时间

目前使用领域

HEVC(H.265)

MPEG/ITU-T

2013

研发中

H.264

MPEG/ITU-T

2003

各个领域

MPEG4

MPEG

2001

不温不火

MPEG2

MPEG

1994

数字电视

VP9

Google

2013

研发中

VP8

Google

2008

不普及

VC-1

Microsoft Inc.

2006

微软平台

H.264只是一个编码标准,不是一个具体的编码器,H.264只是给编码器的实现提供参考,而其中性能最好的当属x264编码器。

这是它们编码效率的对比:HEVC > VP9 > H.264> VP8 > MPEG4 > H.263 > MPEG2

音频编码的主要作用是将音频采样数据(PCM等)压缩成为音频码流,从而降低音频的数据量。音频编码也是互联网视音频技术中一个重要的技术。但是一般情况下音频的数据量要远小于视频的数据量,因而即使使用稍微落后的音频编码标准,而导致音频数据量有所增加,也不会对视音频的总数据量产生太大的影响。高效率的音频编码在同等的码率下,可以获得更高的音质。

音频编码格式一览

名称

推出机构

推出时间

目前使用领域

AAC

MPEG

1997

各个领域(新)

AC-3

Dolby Inc.

1992

电影

MP3

MPEG

1993

各个领域(旧)

WMA

Microsoft Inc.

1999

微软平台

近年来并未推出全新的音频编码方案,可见音频编码技术已经基本可以满足人们的需要。音频编码技术近期绝大部分的改动都是在MP3的继任者——AAC的基础上完成的。

这是音频编码之间的比较:AAC+ > MP3PRO > AAC> RealAudio > WMA > MP3

下表是不同封装格式支持的视频编码与音频编码。

1.2视频播放器原理

对一个视频文件的构成了解之后,想必你大概可以猜出视频播放器播放视频的流程了。

视频播放器播放一个互联网上的视频文件,需要经过以下几个步骤:解协议,解封装,解码视音频,视音频同步。如果播放本地文件则不需要解协议,为以下几个步骤:解封装,解码视音频,视音频同步。他们的过程如图所示。

android 视频流保存为 Mp4 android 视频格式_封装格式


从图中可以看到,整个流程很简单,如同拆一个礼物盒子,一步一步来,总能见到东西。

解协议的作用,就是将流媒体协议的数据,解析为标准的相应的封装格式数据。视音频在网络上传播的时候,常常采用各种流媒体协议,例如HTTP,RTMP,或是MMS等等。这些协议在传输视音频数据的同时,也会传输一些信令数据。这些信令数据包括对播放的控制(播放,暂停,停止),或者对网络状态的描述等。解协议的过程中会去除掉信令数据而只保留视音频数据。例如,采用RTMP协议传输的数据,经过解协议操作后,输出FLV格式的数据。

解封装的作用,就是将输入的封装格式的数据,分离成为音频流压缩编码数据和视频流压缩编码数据。封装格式种类很多,例如MP4,MKV,RMVB,TS,FLV,AVI等等,它的作用就是将已经压缩编码的视频数据和音频数据按照一定的格式放到一起。例如,FLV格式的数据,经过解封装操作后,输出H.264编码的视频码流和AAC编码的音频码流。

解码的作用,就是将视频/音频压缩编码数据,解码成为非压缩的视频/音频原始数据。音频的压缩编码标准包含AAC,MP3,AC-3等等,视频的压缩编码标准则包含H.264,MPEG2,VC-1等等。解码是整个系统中最重要也是最复杂的一个环节。通过解码,压缩编码的视频数据输出成为非压缩的颜色数据,例如YUV420P,RGB等等;压缩编码的音频数据输出成为非压缩的音频抽样数据,例如PCM数据。

视音频同步的作用,就是根据解封装模块处理过程中获取到的参数信息,同步解码出来的视频和音频数据,并将视频音频数据送至系统的显卡和声卡播放出来。

1.3流视频,直播与点播

流媒体协议是服务器与客户端之间通信遵循的规定。

主要流媒体协议一览

名称

推出机构

传输层协议

客户端

使用领域

RTSP+RTP

IETF

TCP+UDP

VLC, WMP

IPTV

RTMP

Adobe Inc.

TCP

Flash

互联网直播

RTMFP

Adobe Inc.

UDP

Flash

互联网直播

MMS

Microsoft Inc.

TCP/UDP

WMP

互联网直播+点播

HTTP

WWW+IETF

TCP

Flash

互联网点播

直播平台参数对比

名称

协议

封装

视频编码

音频编码

播放器

CNTV

私有

华数TV

RTMP

FLV

H.264

ACC

Flash

六间房

RTMP

FLV

H.264

ACC

Flash

中国教育电视台

RTMP

FLV

H.264

ACC

Flash

北广传媒移动电视

RTMP

FLV

H.264

ACC

Flash

上海IPTV

RTSP+RTP

TS

H.264

MP2

机顶盒

直播服务普遍采用了RTMP作为流媒体协议,FLV作为封装格式,H.264作为视频编码格式,AAC作为音频编码格式。采用RTMP作为直播协议的好处在于其被Flash播放器支持。而Flash播放器如今已经安装在全球99%的电脑上,并且与浏览器结合的很好。因此这种流媒体直播平台可以实现“无插件直播”,极大的简化了客户端的操作。

点播平台参数对比

android 视频流保存为 Mp4 android 视频格式_数据_02


点播服务普遍采用了HTTP作为流媒体协议,H.264作为视频编码格式,AAC作为音频编码格式。采用HTTP作为点播协议有以下两点优势:一方面,HTTP是基于TCP协议的应用层协议,媒体传输过程中不会出现丢包等现象,从而保证了视频的质量;另一方面,HTTP被绝大部分的Web服务器支持,因而流媒体服务机构不必投资购买额外的流媒体服务器,从而节约了开支。点播服务采用的封装格式有多种:MP4,FLV,F4V等,它们之间的区别不是很大。视频编码标准和音频编码标准是H.264和AAC。这两种标准分别是当今实际应用中编码效率最高的视频标准和音频标准。视频播放器方面,无一例外的都使用了Flash播放器。