[英]Connecting SurfaceTextures to camerax preview usecase in android and receive frames on both
我正在開發一個使用 opengl 並將 One CameraTexture 連接到相機的應用程序,如下所示:
val surfaceProvider = getSurfaceProvider(res)
preview.setSurfaceProvider(surfaceProvider)
這就是我初始化 surfaceProvider 的方式
private fun getSurfaceProvider(resolution: Size): SurfaceProvider? {
return SurfaceProvider { request: SurfaceRequest ->
val r = request.resolution
cameraTexture!!.setDefaultBufferSize(r.width, r.height)
effectTexture!!.setDefaultBufferSize(r.width, r.height)
val surface = Surface(surfaceTexture)
request.provideSurface(surface,
executor
) {}
}
}
為什么我需要這樣做? 因為我試圖從主 surfaceTexture 獲取最后一幀作為 bitmap,所以我嘗試了最推薦的兩種方法,即使用 glReadPixels 和 readPixelsFromPBO 都暫停 stream 來獲取 bitmap,我想每秒獲取 30 個位圖對它們產生影響並將它們添加到主框架,我已經堅持了一個月,嘗試了所有可能的解決方案。
UPDT#1:我嘗試將 ImageAnalysis 用例與預覽用例一起使用,它可以工作,但速度很慢,我無法說服它讓我超過 10 fps,而預覽的真實 fps 是非常正常的,所以如果我可以使 ImageAnalysis 的 fps 與預覽相匹配,這也有幫助,我閱讀了 IA 的所有文檔,閱讀了有關背壓策略的信息,嘗試了所有可能的選項,即使不做任何類型的操作也確實很慢重加工,只是
imageProxy.toBitmap()
fun ImageProxy.toBitmap(): Bitmap {
val yBuffer = planes[0].buffer // Y
val vuBuffer = planes[2].buffer // VU
val ySize = yBuffer.remaining()
val vuSize = vuBuffer.remaining()
val nv21 = ByteArray(ySize + vuSize)
yBuffer.get(nv21, 0, ySize)
vuBuffer.get(nv21, ySize, vuSize)
val yuvImage = YuvImage(nv21, ImageFormat.NV21, this.width, this.height, null)
val out = ByteArrayOutputStream()
yuvImage.compressToJpeg(Rect(0, 0, yuvImage.width, yuvImage.height), 50, out)
val imageBytes = out.toByteArray()
return BitmapFactory.decodeByteArray(imageBytes, 0, imageBytes.size)
}
UPDT#2:另外值得一提的是,我沒有使用 previewView(我正在使用 TextureView)所以我無法像使用 previewView 那樣輕松地獲得 bitmap。
我假設您需要Bitmap
的原因是因為您的算法在 CPU 上運行。 在這種情況下, ImageAnalysis
是您最好的選擇。 使用 SurfaceTexture,並從 GPU 下載Bitmap
可能效率不高。
ImageAnalysis
確實支持 30 甚至更高的 FPS。 您可以使用空的分析器來驗證它。 但是,在應用程序發布前一個 ImageProxy 之前,新的ImageProxy
不會到達。 您的格式轉換速度慢嗎?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.