优化 Android 投屏实时性

优化编码延迟

编码器延迟主要优化方式有:

去除B帧,目前Android编码器基本都是 H264 Baseline 配置,没有启动B帧编码。

另外Android 最新 API 多了 MediaFormat.KEY_LATENCY 编码参数,在平台上有没有用,目前资料比较少,不太清楚。

优化网络延迟

通过抓包发现,网络上数据包存在周期性脉冲输出流量,怀疑网络传输中存在小报文拼接批量传输的行为,不利于投屏实时性。

排查发现HTTP服务库基于HTTP/1.1协议实现,启用了chunked传输方式,组装chunk存在拼接行为,通过flush OutputStream可以立即发送一个chunk。

另外TCP协议默认开启了Nagle算法,也会存在缓存下来延迟发送的因为,需要打开 TCP_NODELAY 开关。但是目前用的HTTP服务实现库没有设置接口,暂没有实施。

优化解封装延迟

ffplay/ffmpeg 解封装需要探测封装格式,子流信息。

这些可以直接设置,不需要提测

ffplay -f h264 -framerate 60

另外调试发现,ffplay 在 read_thread 上 find_stream_info 花了很长时间,可以关闭

ffplay -f h264 -framerate 60 -nofind_stream_info

优化解码延迟

调试发现在从读取到第一个 Packet,到渲染出第一帧,有2~3秒时间(帧率较小 fps=1)。

无意中找到 -flags low_delay,用了一下基本感觉不到延迟了。具体的机制网上资料比较少,ffmpeg也没有相关文档说明,还有待进一步研究。

ffplay -f h264 -framerate 60 -nofind_stream_info -flags low_delay

优化渲染延迟

上面将 framerate 设置为很大的数值 60,就是让渲染延迟变小,即使因为抖动引起了延迟,但是因为播放帧率大于输出帧率,播放输出较快,还会追上。

猜你喜欢

转载自blog.csdn.net/luansxx/article/details/89637675