今天又是一个阳光明媚的日子,我正在努力的coding,突然间项目主管来到跟前和我说,我们准备做一个直播项目。
当我听到这个消息的时候内心的os是这样的:
代码语言:txt复制 哎呀我去,这玩意是知识盲区啊!
怎么办?
自己从头写?(不现实)
第三方?
还是和主管确认下吧!
将项目时间、技术实现、后端视频数据处理、可能遇到的问题解决等需要用到太多音视频的专精技术,将这些问题与主管沟通后,最后确定使用第三方而不是自己从头开发,虽然说使用第三方可以轻松很多,但是基本的音视频知识还是要学习下的,下面就是我个人的音视频基础学习记录。
视频
视频概念
代码语言:txt复制 视频(Video)泛指将一系列静态影像以电信号的方式加以捕捉、纪录、处理、储存、传送与重现的各种技术。
连续的图像变化每秒超过24帧(frame)画面以上时,根据视觉暂留原理([余晖效应](https://baike.baidu.com/item/视觉暂留/5125149)),
人眼无法辨别单幅的静态画面;看上去是平滑连续的视觉效果,这样连续的画面叫做视频(来自百度解释)。
通俗的解释就是有大量画面通过照片记录的形式在每秒钟超过24张及以上的速度不停播放,
在播放过程中人眼的余晖效应造成了连续的画面效果,也就是我们看到的视频。
例如:
视频本质
代码语言:txt复制 视频在不包含音频的时候,实质上就是一组帧图片,经过视频编码成为视频文件。
视频基本参数
1)分辨率:视频画面的面积大小,表示方法一般是width×height(像素),与图像大小成正比,分辨率越高,图像越清晰需要的存储空间越大。分辨率常见表示单位有dpi(点每英寸)、lpi(线每英寸)、ppi(像素每英寸)、PPD(像素每度)。分辨率决定像素数量! 2)帧率:每秒的帧数量,单位是fps,也是我们常说的屏幕的每秒刷新频率(简单理解为每秒播放多少张图像)。帧率越高会影响画面质量,帧率越低会影响观感。帧率决定整个画面的数量!以下为不同帧率时的观感效果:
3)码率:每秒的视频传输数据量,单位是bps,注意是bit不是Byte,码率决定整个画面的数据量。 码率越大,说明单位时间内的采样率越大,数据流精度就越高,这样表现出来的的效果就是:视频画面更清晰画质更高”。
视频帧概念
简单来说,如果将一幅接一幅单个的画面,逐个连续切换展示,只要切换速度快到人眼无法觉察,就成了视频。每一幅画面,就是一帧。
帧类型
H.264编码格式常见的帧类型有I帧、P帧、B帧、SI帧等,
- I帧:英文全写Intra Picture 又称帧内编码帧 俗称关键帧,记录了一副完整的画面,可以被直接解码显示,两个相连续的I帧之间的一组帧又称为GOP(Group of Picture--图片序列)。一个普通的360P的编码I帧的大小在100-200k左右,P帧小于10k。
- P帧:英文全写predictive-frame,又称前向预测编码帧,也有帧间预测编码帧。不记录画面,记录的是本帧与前一帧之间的差异,P帧不能需要依赖前面的I帧或者P帧才能进行编解码(注:单独拿到P帧无法解析出画面)。P帧的码率非常低,只有I帧的1/20左右。
- B帧:英文全写bi-directional interpolatedprediction frame,又称双向预测内插编码帧,简称双向预测编码帧。记录的是本帧与前一帧、后一帧的差异。带有B帧的视频在解码时的逻辑会更复杂些,CPU开销会更大。B帧的大小为P帧的一半左右,在短视频中常用!
- SI和SP帧:SI和SP帧不常见,用于H.264中切换码流时使用。大部分硬件不支持,一般在定制性的硬件中常用!
视频原始数据格式(原始流)
YUV:是编译true-color颜色空间(color space)的种类,Y'UV, YUV,YCbCr,YPbPr等专有名词都可以称为YUV,彼此有重叠。“Y”表示明亮度(Luminance或Luma),也就是灰阶值,“U”和“V”表示的则是色度(Chrominance或Chroma),作用是描述影像色彩及饱和度,用于指定像素的颜色。推荐一篇详细的YUV介绍RGB :计算机彩色显示器显示色彩的原理与彩色电视机一样,都是采用R(Red)G(Green)B(Blue)相加混色的原理:通过发射出三种不同强度的电子束,使屏幕内侧覆盖的红绿蓝磷光材料发光而产生色彩这种色彩的表示方法称为RGB色彩空间表示(它也是多媒体计算机技术中用得最多的一种色彩空间表示方法)。 RGB在计算机中的表示主要分为两大类,一种是索引形式,一种是像素形式: 1、索引形式: 1)索引格式是计算机早期的一种格式,它的优点比较节省空间,缺点是表现的色彩有限,目前格式基本被抛弃了,不再被使用 2)索引格式中的bit存储的并非是实际的R,G, B值,而是对应点的像素在调色板中的索引 3)调色板,可以简单理解为通过编号映射到颜色的一张二维表。如01索引,表示红色。采用索引格式的RGB,红色的像素对应存储的值便是索引01。就像指针一样,存储的是值的地址,而不是真正的值 2、像素格式:RGB像素格式中的bit存储的是每一个像素点的R,G,B。
编码格式
H.264(AVC):使用较广泛(主流)
H.265:由于版权原因使用率较低
推荐一个更详细的编码格式解释
常用封装格式
封装格式的辨认非常简单,多数情况下,扩展名就是封装格式的名字。比如一个文件“变形金刚.avi”,观察这个文件的后缀为.avi,属于avi的封装格式,“变形金刚2.Mkv”,它就属于mkv封装格式, “变形金刚3.rmvb”就是rmvb封装格式。简而言之,视频文件后缀名就是封装格式的名字。
常用视频格式及对应的文件格式 | |
---|---|
视频封装格式 | 视频文件格式 |
AVI(Audio Video Interleave) | AVI |
WMV(Windows Media Video) | WMV |
MEPG(Moving Picture Experts Group) 分为MPEG - 1、MPEG - 2、MPEG - 3、MPEG - 4 | MPG MPEG VOB DAT 3GPMP4 |
Real Video | RM RMVB |
QuickTime File Format | MOV |
Flash Video | FLV |
音频
音频概念
指人耳可以听到的声音频率在20Hz~20kHz之间的声波。
基本参数
1、采样率:每秒采集的声音样本点数量,单位为Hz(赫兹,次/每秒)。例:48000Hz是每秒钟采集48000个点。 2、声道数:同时采集同一个音源的通道数量,常见单声道(mono)或立体声(stereo)。例:使用两个麦克风同时采集一个人讲话,将两个音频合在一起就为双声道。只有一个麦克风采集,就是单声道。 3、位宽:也叫采样位宽,指保存单个声音样本点的比特位数,通常是16bit。
音频帧概念
音频帧是数采样点数量,把一定数量的连续采样点组合到一起,就是一个音频帧
因为音频的采样率基本固定,因此音频帧的大小都是固定的时长,计算方式:
音频原始数据格式
常见的原始数据格式:PCM
编码格式
AAC:适合音乐,编解码延时在100~200ms左右
Opus:适合人声通话,编解码延时20ms左右
封装格式
AAC
MP3
不需要封装(裸流。流:编码之后的数据)
音视频过程
音视频客户端实现过程
- 采集:数据的来源。
- 处理:数据进行加工处理。
- 渲染:展示数据。
- 传输:数据共享。
大体流程图如下:
音视频采集
产生音视频数据的源头叫做输入设备,在输入设备中获取音视频原始数据的过程,称为采集。
使用的设备主要为摄像头、麦克风,也可以为已有的视频文件或电脑桌面的某一块区域。
音视频预处理
在采集到的原始数据大多数情况下不是我们需要的,而是要经过一些裁剪、缩放、美白、磨皮、人脸识别、物体识别、证件识别、变声处理等,这些在拿到原始数据后进行的一些列操作均为预处理。
音视频编码
- 经过预处理之后的原始数据,体积十分庞大,不方便传输以及其他处理,因此还需要对其进行压缩,减少体积,这项工作就是编码。
- 执行编码操作的工具叫编码器,压缩数据的算法叫编码格式。
音视频编码
- 解码就是编码的逆操作,把编码后的压缩数据解压成原始数据。
- 执行解码操作的工具叫解码器,通常解码器与编码器是一体的,称为编解码器codec。
音视频渲染与展示
- 解码之后的原始数据,需要通过渲染才能变成设备可以直接使用的信息,展示到输出设备上。
- 输出设备用来显示或播放画面、声音,可以是硬件比如显示器、投影仪、音箱、耳机,也可以是软件定义如SurfaceView。
音视频文件封装
- 声音与画面在采集、预处理、编码的过程中,都是分开进行处理的,但实际播放的时候,需要将声音和画面同时展示,因而需要将音频和视频编码后的数据打包到一个文件里。
- 存放音视频内容的叫做封装容器,文件类型叫封装格式。
- 文件封装与解封装是互逆的操作过程。
音视频传输网络协议
- 音视频数据在网络中的传输一般都使用特定的协议,称为流媒体协议。
- 将音视频文件通过协议打包后,会走网络接口发送出去。
- 对端接收网络包之后,需要解开协议包,才可以拿到音视频文件。
常用流媒体协议
RTMP:基于TCP的七层协议,由于性价比高,成为了目前直播推流事实标准。缺陷:握手很麻烦,当并发数很高的时候,会占用大量的端口资源,不适合用作高规格的分发。走1935端口,在防火墙穿透存在一定问题。
HTTP-FLV:基于TCP,使用HTTP传输FLV流,由于分发能力强,适合做CDN分发。播放端首推。
HLS:基于TCP,被HTML5写进标准支持,虽然延时大,但是兼容H5。
RTP:基于UDP的四层协议,定义简单而且性能好,只是单纯的传输,需要配合额外的信令协议。
私有协议:厂商自定私有协议。
常用流媒体协议对比
音画同步
是指播放器正在渲染的每一帧画面和正在播放的每一段声音都是严格对应起来的,不存在人耳和肉眼可以分辨出来的偏差。
音画同步实现过程
当一段视频文件进入播放器后,音频和视频被分离,被分离之后分别进入到不同的解码器中进行解码,解码之后在渲染之前会进行音画同步。
PTS:
标记的是将此帧数据进行渲染展示的时间戳
每一个音频帧和视频帧都会带有一个PTS(时间戳),在视频和音频的初始时间戳是相同的,当播放器读到相同的或者相近的一帧的时候会进行渲染展示出来。由于音频帧时长固定,其PTS是稳定增长的,所以用来做参考时间轴,将PTS相近的视频帧按参考时间轴进行展示。
例:以音频的PTS作为参考时间轴,音频一直在播放,当播放到39.3ms时,视频帧有PTS与其相近,这时将视频帧渲染出来,音频继续播放,播放到90ms时,又有一个视频帧的PTS相近,再将视频帧渲染出来,以此类推。
音画不同步主要原因
- PTS不对,常见于外界摄像头和麦克风。
- PTS正确,实际内容有问题。
- 播放端设备性能与码率不匹配。
- 上行网络抖动较大,视频、音频帧丢包。
- 视频混流。
(注:以上内容如有不正确,请指正)