Android ไม่สามารถเล่นวิดีโอได้เฉพาะเสียงหลังจากใช้ Camera2 API createCaptureSession

เวอร์ชัน Android: 5.1

สวัสดี ฉันสังเกตเห็นว่า หลังจาก แอปของฉันใช้ Camera2 API เพื่อสร้างCaptureSession (สแนปชอต/บันทึก) อุปกรณ์ Android ของฉันไม่สามารถเล่นวิดีโอได้อย่างถูกต้องอีกต่อไป มีเพียงเสียงที่มี หน้าจอสีดำ... และไม่ใช่แค่แอปของฉันเท่านั้น แอปสตรีมมิ่งอื่นๆ ทั้งหมดก็ประสบปัญหาเดียวกัน ฉันต้องรีบูตเพื่อแก้ไขปัญหานี้ อย่างไรก็ตาม อุปกรณ์ของฉันได้รับการปรับแต่งดังนั้นฉันจึงไม่สามารถใช้ ADB ได้ และปัญหานี้ก็ไม่เกิดขึ้นในโปรแกรมจำลองของฉันด้วยซ้ำ... ฉันแค่ไม่มีเบาะแสใดๆ เลยตอนนี้ มันกำลังจะฆ่าฉันแล้ว ใครสามารถช่วยฉันหน่อยได้ไหม? ฉันจะขอบคุณมัน..!! ด้านล่างนี้คือวิธีที่ฉันสร้าง CaptureSession และเผยแพร่ อาจมีบางอย่างผิดปกติกับรหัสของฉัน?

ภาพรวม:

...after camera opened
                cameraDevice = p0;

                previewTextureListener = PreviewSurfaceTextureListener()

                cameraPreview.surfaceTextureListener = previewTextureListener
                
                cameraPreview.setTransform(transform)

...after previewTextureListenerAvailable 

                val captureWidth = 1920
                val captureHeight = 1080

                previewSurfaceTexture = surfaceTexture

                previewSurfaceTexture?.setDefaultBufferSize(captureWidth, captureHeight)

                previewSurface = Surface(previewSurfaceTexture)

                val sessionStateCallback = SessionStateCallback()

                imageReader = ImageReader.newInstance(captureWidth, captureHeight, ImageFormat.JPEG, 1)

                imageReader?.setOnImageAvailableListener(ImageAvailableCallback(), cameraHandler)

                imageSurface = imageReader?.surface

                val outputs = mutableListOf(previewSurface, imageSurface)

                cameraDevice?.createCaptureSession(outputs, sessionStateCallback, mainHandler)

...after sessionStateConfigured

            val requestBuilder = cameraDevice?.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW)

            requestBuilder?.addTarget(previewSurface!!)

            val request = requestBuilder?.build()

            cameraCaptureSession?.setRepeatingRequest(request!!, PreviewImageCallback(), mainHandler)

บันทึก:


        // Start a capture session
        cameraDevice?.createCaptureSession(listOf(previewSurface, mediaRecorder?.surface), RecordSessionStateCallback(), cameraHandler)

... after RecordSessionConfigured

            val recordRequest = cameraDevice?.createCaptureRequest(CameraDevice.TEMPLATE_RECORD);

            recordRequest?.addTarget(previewSurface!!);

            recordRequest?.addTarget(mediaRecorder?.surface!!)

            cameraRecordSession?.setRepeatingRequest(recordRequest?.build()!!, PreviewImageCallback(), cameraHandler)

เมื่อการกระทำบนDestroy:

        cameraPreview?.surfaceTextureListener = null

        cameraCaptureSession?.stopRepeating()

        cameraCaptureSession?.close()

        cameraDevice?.close()

        cameraDevice = null

person Yu Hung Hsu    schedule 30.10.2020    source แหล่งที่มา


คำตอบ (1)


เป็นเรื่องยากที่จะบอกได้หากไม่มีบันทึกจากอุปกรณ์ แต่ส่วนใหญ่แล้ว มีบางอย่างผิดปกติในชุดตัวแปลงสัญญาณสื่อของอุปกรณ์ จะทำให้โคเดกอยู่ในสถานะไม่ดีหลังจากที่แอปของคุณใช้งาน MediaRecorder เสร็จแล้ว ซึ่งต้องรีบูตก่อนที่จะทำงานได้อีกครั้ง สำหรับการเข้ารหัสหรือถอดรหัส

อาจเป็นไปได้ว่าการตั้งค่าเฉพาะที่คุณใช้สำหรับ MediaRecord จะทำให้เกิดสิ่งนี้ แต่บนอุปกรณ์ที่สร้างขึ้นอย่างเหมาะสม สิ่งนี้ไม่ควรเกิดขึ้นไม่ว่าคุณจะตั้งค่าไว้อย่างไรก็ตาม

น่าเสียดาย หากนั่นคือปัญหา จำเป็นต้องได้รับการแก้ไขภายในโคเดก HAL สำหรับอุปกรณ์ ซึ่งเป็นไปได้มากที่สุด หรือในโค้ดสื่อ stagefright หากได้รับการแก้ไขจากเวอร์ชัน AOSP มีอะไรผิดปกตินั้นเป็นไปไม่ได้ที่จะทราบหากไม่มีบันทึก แต่การหยุดชะงักในการปิดตัวแปลงสัญญาณอาจเป็นไปได้อย่างหนึ่ง

person Eddy Talvala    schedule 30.10.2020