Java Android上接收UDP数据速度慢

Java Android上接收UDP数据速度慢,java,android,kotlin,udp,streaming,Java,Android,Kotlin,Udp,Streaming,我正在尝试通过Wi-Fi传输摄像头发送的视频。官方应用程序的性能很好,我想知道为什么我的实现会滞后 摄像机通过UDP发送数据,每个数据包包含一个JPEG图像+一些元数据 我这里的问题是关于无限循环的一般结构。您认为该代码是否更高效和/或更可靠 我还收到了很多轮询超时错误(频率当然取决于我在套接字上的超时时间) 另外,run方法在后台线程中执行 override fun run(){ android.os.Process.setThreadPriority(android.os.Process.T

我正在尝试通过Wi-Fi传输摄像头发送的视频。官方应用程序的性能很好,我想知道为什么我的实现会滞后

摄像机通过UDP发送数据,每个数据包包含一个JPEG图像+一些元数据

我这里的问题是关于无限循环的一般结构。您认为该代码是否更高效和/或更可靠

我还收到了很多
轮询超时错误
(频率当然取决于我在套接字上的超时时间)

另外,
run
方法在后台线程中执行

override fun run(){
android.os.Process.setThreadPriority(android.os.Process.THREAD\u PRIORITY\u后台)
套接字=空
试一试{
套接字=DatagramSocket(udpPort)
插座?soTimeout=1000
}捕获(错误:异常){
错误。消息?让我告诉你{
Log.e(“$TAG/run”,“无法为流式处理创建套接字:${error.message}”)
}
}
套接字?.let{socket->
//摄像机在一个UDP数据包中发送每个图像,通常在25000到30000字节之间。
//为了安全,我们在这里设置了35000。
var udpPacketBuffer:ByteArray
当前帧:位图?
var receivedPacket:DatagramPacket?=null
currentFrame=null
而(!Thread.interrupted()){
试一试{
udpPacketBuffer=ByteArray(35000)
receivedPacket=DatagramPacket(
udpPacketBuffer,udpPacketBuffer.size,
地址,udpPort
)
插座?接收(接收分组)
imageExecutor.submit{
currentFrame=getImage(接收数据包)
currentFrame?.let{currentFrame->
//在应用程序中显示图像。
//对此进行评论并不能消除滞后。
图像消费者(当前帧)
}
}
}捕获(错误:异常){
错误。消息?.let{Log.e($TAG/run),it)}
}
}
}
imageExecutor.shutdown()
插座?.close()
Thread.interrupted()
}
private fun getImage(接收数据包:DatagramPacket):位图?{
var currentFrame:位图?=null
试一试{
var imageData=getImageData(receivedPacket)
currentFrame=BitmapFactory.decodeByteArray(imageData,0,imageData.size)
}捕获(错误:异常){
错误。消息?.let{Log.e($TAG/getImage),it)}
正在加载?.let{it()}
}
返回当前帧
}
private fun getImageData(接收数据包:DatagramPack):ByteArray{
val udpData=receivedPacket.data
//摄像机给每个数据包添加了某种头,我们需要忽略它
val videoDataStart=getImageDataStart(receivedPacket,udpData)
返回Arrays.copyOfRange(udpData、videoDataStart、receivedPacket.length)
}
private fun getImageDataStart(接收包:DatagramPacket,udpData:ByteArray):Int{
var videoDataStart=130
//图像数据开始于前130个字节之后的某个位置,但最后是320个字节
变量k=130
而(k<320&&k