android 协同 实时渲染问题 scrcpy的小技巧

android 协同或者直播

我自己开发android的apk直接开启录制屏幕,然后传输H264到PC端,我发现无法实时,但scrcpy却可以做到,我一步步查找代码进行分析

format.setLong(MediaFormat.KEY_REPEAT_PREVIOUS_FRAME_AFTER, 100_000);

Applies only when configuring a video encoder in "surface-input" mode. The associated value is a long and gives the time in microseconds after which the frame previously submitted to the encoder will be repeated (once) if no new frame became available since.

上面goolge的解释,如果没有新的帧就会重复上一个帧,我不知道这么设置后就可以看起来实时,不然大概就是2秒左右的延迟,我自己手机浏览器显示时间就可能明显感觉到。我之前没有用h264编码时候,直接截图都没有延迟,可能就是编码导致的,因为图片没有变化就不会进行编码,可能下次编码就需要等待一段时间,所以产生的延迟了。

h5显示出现延迟

我自己改了好多代码发现网页显示渲染比较慢,代码调整几次都发现有2秒的延迟,无论用画布还是别人渲染方法都不是很好,所以我直接放弃还是用SDL进行渲染。

SDL渲染出现残影(偶尔显示之前帧)

这个问题开始我以为数据传送有问题,我后面直接改成本地文件读取帧,也有问题。
我突然想到可能没有加延迟,导致渲染过快有残影出现,我后面加了SDL_Delay(1) 一毫秒延迟就再也没有出现了。

总结

自己开发的时候减少很多业务代码,scrcpy用了队列,用C的指针来代替工厂类,这种代码不好方便找代码,对自己开发的那确实比较舒服。
用webview显示实时做不到,网上看了好多方案,貌似都不是很好,都基本有2秒左右延迟。