直播技术详解之采集
采集是整个视频推流过程中的第一个环节,它从系统的采集设备中获取原始视频数据,将其输出到下一个环节。视频的采集涉及两方面数据的采集:音频采集和图像采集,它们分别对应两种完全不同的输入源和数据格式。
音频采集
音频数据既能与图像结合组合成视频数据,也能以纯音频的方式采集播放,后者在很多成熟的应用场景如在线电台和语音电台等起着非常重要的作用。音频的采集过程主要通过设备将环境中的模拟信号采集成 PCM 编码的原始数据,然后编码压缩成 MP3 等格式的数据分发出去。常见的音频压缩格式有:MP3,AAC,HE-AAC,Opus,FLAC,Vorbis (Ogg),Speex 和 AMR等。
音频采集和编码主要面临的挑战在于:延时敏感、卡顿敏感、噪声消除(Denoise)、回声消除(AEC)、静音检测(VAD)和各种混音算法等。
在音频采集阶段,参考的主要技术参数有 :
采样率(samplerate
采样就是把模拟信号数字化的过程,采样频率越高,记录这一段音频信号所用的数据量就越大,同时音频质量也就越高。
位宽
每一个采样点都需要用一个数值来表示大小,这个数值的数据类型大小可以是:4bit、8bit、16bit、32bit 等等,位数越多,表示得就越精细,声音质量自然就越好,而数据量也会成倍增大。我们在音频采样过程中常用的位宽是 8bit 或者 16bit。位宽和采样率有关,采样率越高所需要的位宽就越大。
声道数(channels)
由于音频的采集和播放是可以叠加的,因此,可以从多个音频源采集声音,并分别输出到不同的扬声器,故声道数一般表示声音录制时的音源数量或回放时相应的扬声器数量。声道数为 1 和 2 分别称为单声道和双声道,是比较常见的声道参数。举个例子:当进行录歌时,一般分为乐队伴奏和自己的声音,有一个轨道是专门录声音,另一个专门是录乐队伴奏。一般是先录伴奏,录制好后你听着伴奏唱歌来录制声音。这就是所谓的双声道,也叫双音轨。
音频帧(frame)
音频跟视频很不一样,视频每一帧就是一张图像,而音频数据是流式的,本身没有明确的一帧帧的概念。在实际的应用中,为了音频算法处理/传输的方便,一般约定俗成取 2.5ms~60ms 为单位的数据量为一帧音频。这个时间被称之为“采样时间”,其长度没有特别的标准,它是根据编解码器和具体应用的需求来决定的。
根据以上定义,我们可以计算一下一帧音频帧的大小。假设某音频信号是采样率为 8kHz、双通道、位宽为 16bit,20ms一帧,则一帧音频数据的大小为:
size = 8000 x 0.02s x 16bit x 2 = 5120 bit = 640 byte
如果我们采集1s数据的话,那么需要的存储空间大约是31M,是个大小是无法容忍的。所以在声音采集后需要对其进行压缩处理。
视频采集
视频其实是图片组合成一组连续播放的动画(就像幻灯片一样)。视频的采集过程主要由摄像头等设备拍摄成YUV编码的原始数据,然后经过编码压缩成 H.264 等格式的数据分发出去。常见的视频封装格式有:MP4、3GP、AVI、MKV、WMV、MPG、VOB、FLV、SWF、MOV、RMVB 和 WebM 等。
视频采集和编码面临的主要挑战在于:设备兼容性差、延时敏感、卡顿敏感以及各种对图像的处理操作如美颜和水印等。
在视频采集时有个码率的概念,码率的单位为kbps,它表示单位时间内采集的字节数,码率越高采集的视频越清晰
在采集阶段,参考的主要技术参数有:
视频格式
通常采用YUV格式存储原始数据信息,其中包含用8位表示的黑白图像灰度值,以及可由RGB三种色彩组合成的彩色图像。
传输通道
正常情况下视频的拍摄只需1路通道,随着VR和AR技术的日渐成熟,为了拍摄一个完整的360°视频,可能需要通过不同角度拍摄,然后经过多通道传输后合成。
分辨率
随着设备屏幕尺寸的日益增多,视频采集过程中原始视频分辨率起着越来越重要的作用,后续处理环节中使用的所有视频分辨率的定义都以原始视频分辨率为基础。摄像头的分辨率越高,采集到的视频越清晰。
采样频率
采样频率反映了摄像头处理图像的速度和能力。在进行高度图像采集时,需要注意摄像头的采样频率是否满足要求。采样率越高,图像质量越高,同时保存这些图像信息的数据量也越大。
以上,构成了一个视频采集的主要技术参数,以及视频中音频和图像编码的常用格式。而对于直播 App 开发者来说,了解这些细节虽然更有帮助,但实际开发过程中可能很少能够关注采集环节中技术参数的控制,而是直接在 SDK 中将采集后的数据传递给下一个「处理」和「编码」环节。
采集源
摄像头采集
对于视频内容的采集,目前摄像头采集是社交直播中最常见的采集方式,比如主播使用手机的前置和后置摄像头拍摄。在现场直播场景中,也有专业的摄影、摄像设备用来采集。安防监控场景中也有专业的摄像头进行监控采集。
屏幕录制
屏幕录制采集的方式在游戏直播场景中非常常见,Android中屏幕的录制权限是开放的,所以很好实现。而 iOS 则由于系统本身没有开放屏幕录制的权限而没法直接操作,但对于iOS 9以上的版本,是有个取巧的办法,可以通过模拟一个 AirPlay 镜像连接到(当前 App)自身,这样就可以在软件上捕获到屏幕上的任何操作,达到录制屏幕的效果。
在教育直播或者会场演讲场合,我们经常看见需要录制电脑桌面上 PPT 的场景,针对这种场景,目前市面上比较方便的方案是使用开源的桌面推流工具 OBS 来进行屏幕录制和推流:Open Broadcaster Software
从视频文件推流
除了从硬件设备采集视频进行推流之外,我们也可能需要将一个视频或者音频文件以直播流的形式实时传输给观众,比如在线电台或者电视节目,它们的输入可能直接来自于一些已经录制剪辑好的视频内容。