androidx / androidx/media

Video codec error

Open
#835 7 comments 2 reactions 1 assignee View on GitHub

@tianyif is already working on this.

Since Nov 24, 2023.

bug needs triage
Dominant language
Java
Stars
3k
Forks
955
Avg merge
12d 14h
Merged PRs (30d)
2

Description

Version

Media3 1.2.0

More version details

No response

Devices that reproduce the issue

xiaomi note 12 Android 14

Devices that do not reproduce the issue

No response

Reproducible in the demo app?

Yes

Reproduction steps
  1. Copy the video file into the app's own files
  2. play the video from the app's own video
Expected result

play the video the video smoothly

Actual result
 Access denied finding property "ro.vendor.audio.5k"
2023-11-24 12:47:33.600 11065-11199 BufferQueueProducer     com.wangyiheng.vcamsx                E  [SurfaceView[com.wangyiheng.vcamsx/com.wangyiheng.vcamsx.MainActivity]#10(BLAST Consumer)10](id:2b390000000e,api:0,p:-1,c:11065) dequeueBuffer: BufferQueue has no connected producer
2023-11-24 12:47:33.601 11065-12650 MediaCodecVideoRenderer com.wangyiheng.vcamsx                E  Video codec error
                                                                                                      java.lang.IllegalStateException
                                                                                                          at android.media.MediaCodec.native_queueInputBuffer(Native Method)
                                                                                                          at android.media.MediaCodec.queueInputBuffer(MediaCodec.java:2672)
                                                                                                          at androidx.media3.exoplayer.mediacodec.AsynchronousMediaCodecBufferEnqueuer.doQueueInputBuffer(AsynchronousMediaCodecBufferEnqueuer.java:227)
                                                                                                          at androidx.media3.exoplayer.mediacodec.AsynchronousMediaCodecBufferEnqueuer.doHandleMessage(AsynchronousMediaCodecBufferEnqueuer.java:200)
                                                                                                          at androidx.media3.exoplayer.mediacodec.AsynchronousMediaCodecBufferEnqueuer.access$000(AsynchronousMediaCodecBufferEnqueuer.java:47)
                                                                                                          at androidx.media3.exoplayer.mediacodec.AsynchronousMediaCodecBufferEnqueuer$1.handleMessage(AsynchronousMediaCodecBufferEnqueuer.java:96)
                                                                                                          at android.os.Handler.dispatchMessage(Handler.java:106)
                                                                                                          at android.os.Looper.loopOnce(Looper.java:210)
                                                                                                          at android.os.Looper.loop(Looper.java:299)
                                                                                                          at android.os.HandlerThread.run(HandlerThread.java:67)
2023-11-24 12:47:33.602 11065-12650 ExoPlayerImplInternal   com.wangyiheng.vcamsx                E  Playback error
                                                                                                      androidx.media3.exoplayer.ExoPlaybackException: MediaCodecVideoRenderer error, index=0, format=Format(1, null, null, video/avc, avc1.4D4028, -1, null, [1080, 1782, 30.0, ColorInfo(BT709, Limited range, SDR SMPTE 170M, false, 8bit Luma, 8bit Chroma)], [-1, -1]), format_supported=YES
                                                                                                          at androidx.media3.exoplayer.ExoPlayerImplInternal.handleMessage(ExoPlayerImplInternal.java:608)
                                                                                                          at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                                                          at android.os.Looper.loopOnce(Looper.java:210)
                                                                                                          at android.os.Looper.loop(Looper.java:299)
                                                                                                          at android.os.HandlerThread.run(HandlerThread.java:67)
                                                                                                      Caused by: androidx.media3.exoplayer.video.MediaCodecVideoDecoderException: Decoder failed: c2.mtk.avc.decoder
                                                                                                          at androidx.media3.exoplayer.video.MediaCodecVideoRenderer.createDecoderException(MediaCodecVideoRenderer.java:1978)
                                                                                                          at androidx.media3.exoplayer.mediacodec.MediaCodecRenderer.render(MediaCodecRenderer.java:883)
                                                                                                          at androidx.media3.exoplayer.video.MediaCodecVideoRenderer.render(MediaCodecVideoRenderer.java:974)
                                                                                                          at androidx.media3.exoplayer.ExoPlayerImplInternal.doSomeWork(ExoPlayerImplInternal.java:1079)
                                                                                                          at androidx.media3.exoplayer.ExoPlayerImplInternal.handleMessage(ExoPlayerImplInternal.java:529)
                                                                                                          at android.os.Handler.dispatchMessage(Handler.java:102) 
                                                                                                          at android.os.Looper.loopOnce(Looper.java:210) 
                                                                                                          at android.os.Looper.loop(Looper.java:299) 
                                                                                                          at android.os.HandlerThread.run(HandlerThread.java:67) 
                                                                                                      Caused by: java.lang.IllegalStateException
                                                                                                          at android.media.MediaCodec.native_queueInputBuffer(Native Method)
                                                                                                          at android.media.MediaCodec.queueInputBuffer(MediaCodec.java:2672)
Media
@Composable
fun HomeScreen() {
    val context = LocalContext.current
    val homeController = remember { HomeController() }
    val path = context.getExternalFilesDir(null)!!.absolutePath
    val file = File(path, "copied_video.mp4")
    val detailAlterShow = remember { mutableStateOf(false) }

    LaunchedEffect(Unit){
        homeController.init()
    }

    val selectVideoLauncher = rememberLauncherForActivityResult(
        contract = ActivityResultContracts.GetContent()
    ) { uri: Uri? ->
        uri?.let {
            homeController.copyVideoToAppDir(context,it)
        }
    }

    val requestPermissionLauncher = rememberLauncherForActivityResult(
        contract = ActivityResultContracts.RequestPermission(),
        onResult = { isGranted: Boolean ->
            if (isGranted) {
                selectVideoLauncher.launch("video/*")
            } else {
                // Handle permission denial
                Toast.makeText(context, "请打开设置允许读取文件夹权限", Toast.LENGTH_SHORT).show()
            }
        }
    )

    Box(
        modifier = Modifier.fillMaxSize().background(Color(255,255,255,1)),
        contentAlignment = Alignment.Center,

    ) {
        Column(
            horizontalAlignment = Alignment.CenterHorizontally,
            modifier = Modifier.width(150.dp)
        ) {
            // 使按钮宽度等于列的最大宽度

            if (detailAlterShow.value) {
                val exoPlayer = remember {
                    ExoPlayer.Builder(context).build().apply {
                        // 配置 ExoPlayer,例如设置媒体源等
                        val mediaItem = MediaItem.fromUri(Uri.fromFile(file))
                        setMediaItem(mediaItem)
                        prepare()
                    }
                }

                Dialog(
                    onDismissRequest = {
                        detailAlterShow.value = false
                        exoPlayer.release() // 释放播放器资源
                    }
                ) {
                    Box(contentAlignment = Alignment.Center, modifier = Modifier.fillMaxSize()) {
                        AndroidView(
                            factory = { context ->
                                PlayerView(context).apply {
                                    player = exoPlayer
                                }
                            },
                            modifier = Modifier
                                .fillMaxWidth()
                                .aspectRatio(16f / 9f) // 根据视频的比例调整
                        )

                        Spacer(modifier = Modifier.height(16.dp))

//                        Button(onClick = {
//                            detailAlterShow.value = false
//                            exoPlayer.release() // 关闭时释放播放器资源
//                        }) {
//                            Text("关闭")
//                        }
                    }
                }
            }




            Button(
                modifier = Modifier.fillMaxWidth(),
                onClick = {
                    requestPermissionLauncher.launch(Manifest.permission.READ_EXTERNAL_STORAGE)
                }
            ) {
                Text("选择视频")
            }
            Button(
                modifier = Modifier.fillMaxWidth(),
                onClick = {
                    detailAlterShow.value = true
                }
            ) {
                Text("查看视频")
            }
            Row(
                verticalAlignment = Alignment.CenterVertically, // 对齐文本和开关
                modifier = Modifier.fillMaxWidth() // 拉伸以匹配按钮宽度
            ) {
                Text("视频开关:", modifier = Modifier.weight(1f)) // 权重使文本占据大部分空间
                Switch(
                    checked = homeController.isVideoEnabled.value,
                    onCheckedChange = {
                        homeController.isVideoEnabled.value = it
                        homeController.saveState()
                        Toast.makeText(context, if (it) "视频打开" else "视频关闭", Toast.LENGTH_SHORT).show()
                    }
                )
            }

            Row(
                verticalAlignment = Alignment.CenterVertically, // 对齐文本和开关
                modifier = Modifier.fillMaxWidth() // 拉伸以匹配按钮宽度
            ) {
                Text("音量开关:", modifier = Modifier.weight(1f)) // 权重使文本占据大部分空间
                Switch(
                    checked = homeController.isVolumeEnabled.value,
                    onCheckedChange = {
                        homeController.isVolumeEnabled.value = it
                        homeController.saveState()
                        Toast.makeText(context, if (it) "声音打开" else "声音关闭", Toast.LENGTH_SHORT).show()
                    }
                )
            }
        }
    }
}

@Preview
@Composable
fun PreviewMessageCard() {
    HomeScreen()
}
Bug Report
  • You will email the zip file produced by adb bugreport to android-media-github@google.com after filing this issue.

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.