gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 00:01:47 25 4
gpt4 key购买 nike

我有一个字节缓冲区:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com