如何将ByteBuffer转换为位图,反之亦然而不丢弃帧?



我有一个ByteBuffer:

var rgbaData = JniUtil.nativeAllocateByteBuffer(frame.width * frame.height * 4)

,其中帧是从直播流媒体获得的VideoFrame。我想将HighPassSkinSmoothing过滤器应用于从上面的缓冲区获得的位图,将位图转换回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字节缓冲区。现在我们可以使用窗口机制,例如滑动窗口/滚动窗口,并按照窗口方法处理数据。这样我们就可以处理流数据。处理完成后,我们可以删除mapappedbytebuffer的底层文件。此外,窗口可以保存mappedbytebuffer的起始/结束地址。此外,窗口的确切大小可能取决于网络的带宽。

最新更新