解密:EasyGBS如何做到低延迟播放?

播放器如果要提供播放效率和秒开其实本质上是做好解复用(Demux) , Demux是指解析视频的封装格式 , 得到包含的音视频原始码流 , Demux时间越短 , 就越快得到视频流 , 从而加快秒开速度 , 实现我们想要的低延迟播放的效果 。
解密:EasyGBS如何做到低延迟播放?
文章图片

文章图片
以TSINGSEE青犀视频流媒体平台为例 , EasyGBS中的Demux过程主要是解析RTP负载数据 , 每个RTP包 , 去除头部12字节头部数据后就是负载数据(真实数据) 。由于国标视频基本都是封装为PS流格式 , 所以需要解复用PS流 , 从PS流里得到原始视频数据 。
对于PS流的Demux有两个方法 , 一个是自己熟悉过程自己操刀自己写 , 还有一个方法是使用ffmpeg 。对于ffmpeg如何DemuxPS流 , 可以参考ffmpeg的avio_reading例子 , 通过探测流的方式DemuxPS流 。如果是使用ffmpeg做PS流的Demux , 有几点需要注意:由于ffmpegDemux未知流时 , 需要探测一定大小数据 , 甚至会尝试解码未知流 , 这个过程如果不做优化会耗时很久 。
解密:EasyGBS如何做到低延迟播放?
文章图片

文章图片
【解密:EasyGBS如何做到低延迟播放?】EasyGBS在DemuxPS流需要搜索各种头部 , 由于存在丢包等异常情况 , 所以搜索头部太久时需要做处理 , 丢弃无用的数据 , 避免耗时太久 。由于PS中包长度都是用两字节表示 , 长度为216 , 所以我们可以设置一个值 , 比216大一点 , 当搜索的字节数大于这个值还没搜索一个PS流的包头(0x000001开头) , 此时就要丢弃之前数据 , 处理新数据 , 因为之前数据很大可能丢包或其他问题 。
Demux得到原始视频码流后就可以开始解码了 , 能硬解码就硬解码 , 因为硬解码速度会优于软解 , 特别是在多路解码时 。
解码得到YUV或RGB数据后 , 我们需要渲染到屏幕显示 , 这是最后一步了 。
渲染也存在是否硬件加速的区别 。比如Windows平台 , 优先D3D硬件加速渲染 , 充分发挥显卡的能力 , 加快渲染速度 。如果前面解码是用硬解码 , 此时也必须硬件加速渲染 , 否则又要搬运显存中的硬解数据到内存 。由于解码后的数据一般较大 , 所以这个过程很耗时 , 同时影响性能 , 提高CPU占用率 。