我使用下面的代码从使用MediaMetadataRetriever的远程URL检索视频帧,但它滞后,导致用户界面性能非常低.我怎么才能让它又快又有效率呢?

@Composable
private fun ContentItem(
    modifier: Modifier = Modifier,
    content: Content,
    onClick: (Content) -> Unit
) {
    when (content.type) {
        ContentType.Image -> {
            // handle image
        }

        ContentType.Video -> {
            val bitmap = remember { mutableStateOf<Bitmap?>(null) }

            LaunchedEffect(content) {
                val retriever = MediaMetadataRetriever()
                retriever.setDataSource(content.url)
                // Retrieve frame at 1 second
                bitmap.value = retriever.getFrameAtTime(
                    1000000,
                    MediaMetadataRetriever.OPTION_CLOSEST_SYNC
                )
                retriever.release()
            }

            bitmap.value?.let {
                Image(
                    modifier = modifier,
                    bitmap = it.asImageBitmap(),
                    contentDescription = null
                )
            }
        }
    }
}

推荐答案

不需要在UI线程上做大量工作,您可以使用withContextDispatchers.Default作为

LaunchedEffect(content) {
    withContext(Dispatchers.Default){
        val retriever = MediaMetadataRetriever()
        retriever.setDataSource(content.url)
        // Retrieve frame at 1 second
        bitmap.value = retriever.getFrameAtTime(
            1000000,
            MediaMetadataRetriever.OPTION_CLOSEST_SYNC
        )
        retriever.release()
    }
}

Android相关问答推荐

Android添加设置图标齿轮到应用程序信息

道查询注释部分房间表名称

如何删除Jetpack Compose中的Textfield底线

为什么柱子的高度不都一样?

当按下通知时,将Android应用程序置于前台

更改活动(上下文)对接收到的uri的访问权限的影响?

如何在 kotlin 中接收带有和不带有可空对象的集合并保持引用相同

任务:app:kaptGenerateStubsDebugKotlin执行失败. > 'compileDebugJavaWithJavac' 任务(当前目标是 1.8)

如何将DrawableId参数传递给XML布局?

为什么我收到这个错误我需要安装 android studio

AirDroid Business 如何能够从屏幕截图中排除覆盖?

了解 Compose 声明性逻辑

无法通过 retrofit 解析对 kotlin 数据类的 xml 响应

如何从日期 Select 器计算年龄?

我不能在 jetpack Compose 中使用 TextField()(material 3)

如何在 Android 应用中录制短视频?

是什么让 Android Studio 中的按钮变成紫色?加上新手的其他奇怪行为

在jetpack compose中将图像添加到脚手架顶部栏

优化 Room 数据库迁移

单击后退按钮时,应用程序会在一秒钟后崩溃