簡體   English   中英

將 SurfaceTextures 連接到 android 中的 camerax 預覽用例並在兩者上接收幀

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM