引言
在现在移动互联网如火如荼的时代,流媒体业务在移动互联网业务中所占的比重越来越大,特别是今年直播业务的兴起,使互联网社交进入了直播时代,直播已经成为很多APP特别是社交APP的标配业务。站在一个程序员的角度(coding角度)来看,直播业务其实就是流媒体业务。那么流媒体业务开发涉及到哪些方面的知识呢?下面我们来看看一个流媒体数据(音频数据和图像数据)从采集 ->处理->编码和格式封装 -> 传输-> 解码 -> 播放
整个过程中所涉及到的知识点。例如一个直播业务的流媒体数据从采集到播放是这样的:
采集
采集是整个过程中的第一个环节,它从系统的采集设备中获取原始视频数据,将其输出到下一个环节。视频的采集涉及两方面数据的采集:音频采集和图像采集,它们分别对应两种完全不同的输入源和数据格式。
-
音频采集
采集源:麦克风、系统声音或者本地音频文件等
-
采集内容:
采集过程主要通过设备将环境中的模拟信号采集成 PCM 编码的原始数据,然后编码压缩成 MP3 等格式的数据分发出去。
音频采集和编码主要面临的挑战在于:延时敏感、卡顿敏感、噪声消除(Denoise)、回声消除(AEC)、静音检测(VAD)和各种混音算法等。
在音频采集阶段,参考的主要技术参数有 :
采样率(samplerate):采样就是把模拟信号数字化的过程,采样频率越高,记录这一段音频信号所用的数据量就越大,同时音频质量也就越高。
位宽:每一个采样点都需要用一个数值来表示大小,这个数值的数据类型大小可以是:4bit、8bit、16bit、32bit 等等,位数越多,表示得就越精细,声音质量自然就越好,而数据量也会成倍增大。我们在音频采样过程中常用的位宽是 8bit 或者 16bit。
声道数(channels):由于音频的采集和播放是可以叠加的,因此,可以同时从多个音频源采集声音,并分别输出到不同的扬声器,故声道数一般表示声音录制时的音源数量或回放时相应的扬声器数量。声道数为 1 和 2 分别称为单声道和双声道,是比较常见的声道参数。
音频帧(frame):音频跟视频很不一样,视频每一帧就是一张图像,而从上面的正玄波可以看出,音频数据是流式的,本身没有明确的一帧帧的概念,在实际的应用中,为了音频算法处理/传输的方便,一般约定俗成取 2.5ms~60ms 为单位的数据量为一帧音频。这个时间被称之为“采样时间”,其长度没有特别的标准,它是根据编解码器和具体应用的需求来决定的。
根据以上定义,我们可以计算一下一帧音频帧的大小。假设某音频信号是采样率为 8kHz、双通道、位宽为 16bit,20ms 一帧,则一帧音频数据的大小为:
size = 8000 x 2 x 16bit x 0.02s = 5120 bit = 640 byte
-
图像采集
采集源:摄像头、屏幕录制或者本地的视频文件等
-
采集内容:
图像采集图像采集的图片结果组合成一组连续播放的动画,即构成视频中可肉眼观看的内容。图像的采集过程主要由摄像头等设备拍摄成 YUV 编码的原始数据,然后经过编码压缩成 H.264 等格式的数据分发出去。
图像由于其直观感受最强并且体积也比较大,构成了一个视频内容的主要部分。
图像采集和编码面临的主要挑战在于:设备兼容性差、延时敏感、卡顿敏感以及各种对图像的处理操作如美颜和水印等。
在图像采集阶段,参考的主要技术参数有:
图像传输格式:通用影像传输格式(Common Intermediate Format)是视讯会议(video conference)中常使用的影像传输格式。
图像格式:通常采用 YUV 格式存储原始数据信息,其中包含用 8 位表示的黑白图像灰度值,以及可由 RGB 三种色彩组合成的彩色图像。
传输通道:正常情况下视频的拍摄只需 1 路通道,随着 VR 和 AR 技术的日渐成熟,为了拍摄一个完整的 360° 视频,可能需要通过不同角度拍摄,然后经过多通道传输后合成。
分辨率:随着设备屏幕尺寸的日益增多,视频采集过程中原始视频分辨率起着越来越重要的作用,后续处理环节中使用的所有视频分辨率的定义都以原始视频分辨率为基础。视频采集卡能支持的最大点阵反映了其分辨率的性能。
采样频率:采样频率反映了采集卡处理图像的速度和能力。在进行高度图像采集时,需要注意采集卡的采样频率是否满足要求。采样率越高,图像质量越高,同时保存这些图像信息的数据量也越大。
处理
视频或者音频完成采集之后得到原始数据,为了增强一些现场效果或者加上一些额外的效果,我们一般会在将其编码压缩前进行处理,比如打上时间戳或者公司 Logo 的水印,祛斑美颜和声音混淆等处理
常见视频处理功能:
-
美颜
美颜的主要原理是通过「磨皮+美白」来达到整体美颜的效果。磨皮的技术术语是「去噪」,也即对图像中的噪点进行去除或者模糊化处理,常见的去噪算法有均值模糊、高斯模糊和中值滤波等。当然, 由于脸部的每个部位不尽相同,脸上的雀斑可能呈现出眼睛黑点的样子,对整张图像进行「去噪」处理的时候不需要将眼睛也去掉,因此这个环节中也涉及到人脸和皮肤检测技术
-
视频水印
水印是图片和视频内容中常见的功能之一,它可用于简单是版权保护,或者进行广告设置.也就是在视频图像上的某些位置添加上别的图片或文字。
-
滤镜
在 iOS 端可以考虑使用 GPUImage 这个库,这是一个开源的基于GPU的图片或视频的处理框架,内置了多达120多种常见的滤镜效果。
-
特效
特效其实就是在视频中添加一组动态的图片水印。一般是基于人脸识别的。
编码和格式封装
-
编码
编码是对从采集源获取到的数据或者处理过的数据按照某种规范进行压缩的技术。例如:移动端一般将从采集源获取的音频原始数据(PCM格式)编码成AAC格式的数据,常见的音频压缩格式有:MP3,AAC,HE-AAC,Opus,FLAC,Vorbis (Ogg),Speex 和 AMR等。从采集源获取到的原始图像数据(一般是YUV格式的)编码成 h.264格式的数据。为什么要对这些原始数据进行编码,主要有两个原因:
- 存储困难 :因为原始数据,体积很大。
- 传输困难 :占带宽, 费流量。
为什么可以压缩,主要是因为:
- 空间冗余:图像相邻像素之间有较强的相关性
- 时间冗余:视频序列的相邻图像之间内容相似
- 编码冗余:不同像素值出现的概率不同
- 视觉冗余:人的视觉系统对某些细节不敏感
- 知识冗余:规律性的结构可由先验知识和背景知识得到
数据压缩一般分为 无损压缩(Lossless)和 有损压缩(Lossy)
编码方式:
- 软件编码 常用FFMpeg多媒体库,利用CPU做视频的编码
- 硬件编码 利用GPU或者专用处理器来对视频流进行编码
软件编码比较通用,但是占用CPU资源,编解码效率不高。硬件编码效率很高。
-
封装格式
所谓封装格式也称多媒体容器 (Multimedia Container),也就是将所有的处理好的视频、音频都包装到一个文件容器内呈现给观众,这个包装的过程就叫封装。常见的视频封装格式有:MP4、3GP、AVI、MKV、WMV、MPG、VOB、FLV、SWF、MOV、RMVB 和 WebM 等。
传输
传输是指:通过互联网,地面无线广播,卫星等方式将将压缩的视频码流从编码端传输到解码端。
解码
解码是对已编码的视频数据进行还原解码操作。
解码方式:
> 1. 软件解码 常用FFMpeg多媒体库,利用CPU做视频的解码
> 2. 硬件解码 利用GPU或者专用处理器来对视频流进行解码
软件解码比较通用,但是占用CPU资源,编解码效率不高。硬件解码效率很高。
播放
播放就是将解码后的音频数据通过音响等播放, 将视频图像数据通过显示器等显示。
总结:以上是通过查相关资料整理后的一些个人理解。可能有误敬请各位同学指导批判。后面还会分模块详解。其中参考了雷霄骅很多资料,在此向大神表示敬意。
未完待续。