今天又是一个阳光明媚的日子,我正在努力的coding,突然间项目主管来到跟前和我说,我们准备做一个直播项目。
当我听到这个消息的时候内心的os是这样的:
哎呀我去,这玩意是知识盲区啊!
怎么办?
自己从头写?(不现实)
第三方?
还是和主管确认下吧!
将项目时间、技术实现、后端视频数据处理、可能遇到的问题解决等需要用到太多音视频的专精技术,将这些问题与主管沟通后,最后确定使用第三方而不是自己从头开发,虽然说使用第三方可以轻松很多,但是基本的音视频知识还是要学习下的,下面就是我个人的音视频基础学习记录。
视频(Video)泛指将一系列静态影像以电信号的方式加以捕捉、纪录、处理、储存、传送与重现的各种技术。
连续的图像变化每秒超过24帧(frame)画面以上时,根据视觉暂留原理([余晖效应](https://baike.baidu.com/item/视觉暂留/5125149)),
人眼无法辨别单幅的静态画面;看上去是平滑连续的视觉效果,这样连续的画面叫做视频(来自百度解释)。
通俗的解释就是有大量画面通过照片记录的形式在每秒钟超过24张及以上的速度不停播放,
在播放过程中人眼的余晖效应造成了连续的画面效果,也就是我们看到的视频。
例如:
视频在不包含音频的时候,实质上就是一组帧图片,经过视频编码成为视频文件。
1)分辨率:视频画面的面积大小,表示方法一般是width×height(像素),与图像大小成正比,分辨率越高,图像越清晰需要的存储空间越大。分辨率常见表示单位有dpi(点每英寸)、lpi(线每英寸)、ppi(像素每英寸)、PPD(像素每度)。分辨率决定像素数量! 2)帧率:每秒的帧数量,单位是fps,也是我们常说的屏幕的每秒刷新频率(简单理解为每秒播放多少张图像)。帧率越高会影响画面质量,帧率越低会影响观感。帧率决定整个画面的数量!以下为不同帧率时的观感效果:
3)码率:每秒的视频传输数据量,单位是bps,注意是bit不是Byte,码率决定整个画面的数据量。 码率越大,说明单位时间内的采样率越大,数据流精度就越高,这样表现出来的的效果就是:视频画面更清晰画质更高”。
简单来说,如果将一幅接一幅单个的画面,逐个连续切换展示,只要切换速度快到人眼无法觉察,就成了视频。每一幅画面,就是一帧。
H.264编码格式常见的帧类型有I帧、P帧、B帧、SI帧等,
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
不需要封装(裸流。流:编码之后的数据)
大体流程图如下:
产生音视频数据的源头叫做输入设备,在输入设备中获取音视频原始数据的过程,称为采集。
使用的设备主要为摄像头、麦克风,也可以为已有的视频文件或电脑桌面的某一块区域。
在采集到的原始数据大多数情况下不是我们需要的,而是要经过一些裁剪、缩放、美白、磨皮、人脸识别、物体识别、证件识别、变声处理等,这些在拿到原始数据后进行的一些列操作均为预处理。
RTMP:基于TCP的七层协议,由于性价比高,成为了目前直播推流事实标准。缺陷:握手很麻烦,当并发数很高的时候,会占用大量的端口资源,不适合用作高规格的分发。走1935端口,在防火墙穿透存在一定问题。
HTTP-FLV:基于TCP,使用HTTP传输FLV流,由于分发能力强,适合做CDN分发。播放端首推。
HLS:基于TCP,被HTML5写进标准支持,虽然延时大,但是兼容H5。
RTP:基于UDP的四层协议,定义简单而且性能好,只是单纯的传输,需要配合额外的信令协议。
私有协议:厂商自定私有协议。
是指播放器正在渲染的每一帧画面和正在播放的每一段声音都是严格对应起来的,不存在人耳和肉眼可以分辨出来的偏差。
当一段视频文件进入播放器后,音频和视频被分离,被分离之后分别进入到不同的解码器中进行解码,解码之后在渲染之前会进行音画同步。
标记的是将此帧数据进行渲染展示的时间戳
每一个音频帧和视频帧都会带有一个PTS(时间戳),在视频和音频的初始时间戳是相同的,当播放器读到相同的或者相近的一帧的时候会进行渲染展示出来。由于音频帧时长固定,其PTS是稳定增长的,所以用来做参考时间轴,将PTS相近的视频帧按参考时间轴进行展示。
例:以音频的PTS作为参考时间轴,音频一直在播放,当播放到39.3ms时,视频帧有PTS与其相近,这时将视频帧渲染出来,音频继续播放,播放到90ms时,又有一个视频帧的PTS相近,再将视频帧渲染出来,以此类推。
(注:以上内容如有不正确,请指正)