什么是视频直播?实现视频直播需要哪些步骤?
视频直播是指利用互联网及流媒体技术,硬件视频采集卡组合起来进行直播,视频包含了图像、声音、文字等重要元素,图文声三者合一,效果极佳,逐渐成为互联网的主流方式。视频通过真实、生动的直播,营造出强烈的现场感,吸引眼球,达成印象深刻、记忆持久的传播效果,能够真实、直观、快速、全面、展示自己一个完整的流媒体平台。
视频直播,主要涉及到采集、预处理、编码、传输、服务器转码、解码这样一个流程。
一、视频采集:通过视频采集卡或编码器进行图像采集和音频采集;
图像采集设置摄像头、摄像机,并配置采集的参数、图像数据的长宽、fps、输出的方向、横屏竖屏等,然后从回调中取到数据。
音频采集和编码主要面临的挑战在于:噪声消除、回声消除等。
前期不需要音频数据处理需求的时候,只需配置音频采集的采样率、码率和声道。
二、预处理:分为音频处理和视频处理两个方面。
音频处理是直播难点之一,直播环境会有噪音,所以直播的音频处理是整体降噪的过程。增益降噪等处理可直接从项目中抽出来的声音处理代码,然后调用、处理。如有类似在直播的时候播放背景音乐的混音需求,就需要实现音频数据的混音,而还需要将混音的背景音乐转成PCM数据,拷贝一份送入混音,原来的数据送入播放器。
滤镜、美颜功能是直播标配,如果需要美白、水印、裁剪等处理效果,还要考虑到拿到的数据是YUV还是RGB。通过软件进行采集和美白、水印、裁剪的处理,然后取出来进行编码上传,并显示在预览画面上。
三、编码:
编码:现在广泛采用FFmpeg库结合编码库来实现,FFmpeg+x264来编码视频数据YUV/RGB输出H264数据,FFmpeg+fdk_aac来编码音频数据PCM输出AAC数据。
四、传输:采用FFMPEG进行数据的接收,推流端默认使用FFMPEG进行数据的封包发送。
相对来说,封包更主要注意的一个点是时间戳。字面上可以理解,就是解码时间和显示时间,在没有B帧存在的情况下DTS的顺序和PTS的顺序应该是一样的。这块还涉及到重连和丢帧,用户的网络情况波动断开了,会进行重连。重连失败之后才会发送失败回调。丢帧是一个弱网情况的策略,根据音视频数据的缓冲区大小来判断是否丢帧,丢帧会优先丢非关键帧,保留关键帧,而一旦需要丢关键帧的时,关键帧后的非关键帧也会一起丢掉直到下一个关键帧,来保证画面不会花屏。
五、服务端
现在主流的两种推送协议是RTMP和HLS
六、播放器
播放器主要负责拉流、解码、播放。
1.解析协议
播放器端根据URL解析所用的流媒体协议(RTMP,HLS)。
2.解封装
解封装,从容器格式(FLV,TS)中,分离出音视频数据。
3.解码
解码,就是把获取到的数据解压缩,恢复成原始数据。解码就是将H264变成YUV,AAC变成PCM。解码可以使用软解码,硬解码。
4.渲染数据
采用OpenGL渲染YUV数据,呈现视频画面。将PCM送入设备的硬件资源播放,产生声音。