场景:将手机录屏编码后得到的 byte[]序列化成 protobuf 类
问题:一秒编码 30 帧,随着时间推移,手机会越来越卡。
经过排查,发现是这行代码造成卡顿,
val toByteArray =
screenMes.build().toByteArray()
完整的代码如下:
val byteBuffer: ByteBuffer = ByteBuffer.allocateDirect(1024 * 1024 * 3)
private lateinit var screenMes: KCPMessage.ScreencapMes.Builder
/**
* 编码回调
* bytes 编码后的数据
* flags 是否 I 帧
*/
override fun onScreenInfo(bytes: ByteArray?, flags: Int) {
isRecording = true
if (bytes != null) {
screenMes.data = ByteString.copyFrom(bytes)
screenMes.sort = mFlowSort
if (flags == MediaCodec.BUFFER_FLAG_KEY_FRAME) {
screenMes.frameType = 0
} else {
screenMes.frameType = 1
}
val toByteArray =
screenMes.build().toByteArray()
byteBuffer.clear()
byteBuffer.putInt(toByteArray.size + 4)
byteBuffer.putInt(KcpType.Type_Send_Frame)
byteBuffer.put(toByteArray)
byteBuffer.flip()
if (mUdxState == 1) {
if (mFlowSort > 999999999999999999) {
mFlowSort = 1
}
mFlowSort++
SendUtils.getInstance().handlePacket(true, byteBuffer, screenMes.frameType)
} else {
mFlowSort = 1
}
}
}
奇怪哦,小米,华为,OP,都测了,就三星手机会卡.其他手机都 OK.
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
https://www.v2ex.com/t/868847
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.