java - 如何在不丢帧的情况下将 ByteBuffer 转换为位图,反之亦然?

标签 java android android-studio kotlin

我有一个字节缓冲区:

var rgbaData = JniUtil.nativeAllocateByteBuffer(frame.width * frame.height * 4)
其中 frame 是从直播流媒体获取的 VideoFrame。我想申请HighPassSkinSmoothing过滤到上面的buffer中得到的bitmap,将bitmap转换回ByteArray,放到ByteBuffer中,然后释放回直播流媒体。我已完成以下操作将缓冲区转换为位图,应用过滤器,然后再次将位图转换为 ByteArray,并将其放入缓冲区中。
应用 HighPassSkinSmoothing 滤镜:
val bitmap = getBitmapFromBuffer(frame.width, frame.height, rgbaData)

amniXSkinSmooth.storeBitmap(bitmap, false)
amniXSkinSmooth.initSdk()
amniXSkinSmooth.startSkinSmoothness(600F)
amniXSkinSmooth.startSkinWhiteness(2F)
//sometimes "amniXSkinSmooth.bitmapAndFree" is also null, might be due to wrong conversion process
rgbaData.put(getByteArrayFromBitmap(amniXSkinSmooth.bitmapAndFree))
amniXSkinSmooth.unInitSdk();
将 ByteBuffer 转换为位图:
private fun getBitmapFromBuffer(width: Int, height: Int, buffer: ByteBuffer): Bitmap {
    buffer.rewind()
    val bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888)
    bitmap.copyPixelsFromBuffer(buffer)
    return bitmap
}
将 Bitmap 转换回 ByteArray:
private fun getByteArrayFromBitmap(b: Bitmap): ByteArray {
  val size: Int = b.byteCount
  val buffer = ByteBuffer.allocate(size)
  val bytes = ByteArray(size)
  b.copyPixelsToBuffer(buffer)
  buffer.rewind()
  buffer.get(bytes)
  return bytes
}
通过这样做,我丢失了帧,并且在应用过滤器后实时流也滞后。是否有任何解决方法以使帧不会丢失并且实时流媒体也不会滞后?
如果你们对转换过程或任何事情有任何想法或知识,我们将非常感谢您的帮助。谢谢!!

最佳答案

我认为我们可以使用内存映射文件,例如MappedByteBuffer 可以用作存储来保存 rgb 字节缓冲区。现在我们可以使用窗口机制,例如滑动窗口/翻滚窗口并按照窗口方法处理数据。这样我们就可以处理流数据。处理完成后,我们可以删除映射字节缓冲区的底层文件。窗口也可以保存映射字节缓冲区的开始/结束地址。此外,窗口的确切大小可能取决于网络的带宽。

关于java - 如何在不丢帧的情况下将 ByteBuffer 转换为位图,反之亦然?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72709533/

相关文章:

java - 创建一个子类来表示 Java 中的银行帐户

Android R - ACTION_IMAGE_CAPTURE 的 startActivity 显示不同的选项可供选择

java - 如何更新方法以在按下按钮后从文本观察器返回更新的信息

android - Android无法从AndroidManifest.xml读取packageName

java - 初始化的棘手顺序

java - @Caching 多键

java - HashMap<String,Object>.toMap 的意义是什么

android - 尝试构建应用> 65K(65536)方法时,Android构建项目错误

java - android应用程序无法使用HttpClient获取80端口的内容

android - 使用所需的时区从毫秒显示正确的时间