如何在不阻塞UI线程的情况下录制Jetpack Compose@Composable功能的视频?

How to record a video of a Jetpack Compose @Composable function without blocking UI thread?

提问人:Kolay 提问时间:10/20/2023 更新时间:10/20/2023 访问量:99

问:

上下文

我有一个 Jetpack Compose 功能,它有一个(相机预览视图)和一个我绘制的功能。@ComposableAndroidViewCanvas

这是我的代码的一个非常简化的版本:

@Composable
fun ExerciseCanvasView(...) {
  Box(modifier = Modifier.fillMaxSize()) {
    AndroidView(...)
    Canvas(...)
  }
}

基本上,我想录制此功能的视频并将其保存到文件(video.mp4)中。

我试过的:

  • 媒体投影。我尝试了MediaProjection,但不是我想要的。它记录了整个屏幕,我真的不需要它,它可能会记录敏感信息。
  • 将 composeview 绘制到画布到位图。我也尝试过这个,但是绘图必须在主UI线程(这个问题)中完成,这会阻塞主UI线程,使其无法使用。
  • chatgpt 推荐的其他一些已弃用的恶作剧根本不起作用。

目前,我不在乎我是否必须保存可组合项的捕获,然后将它们编码为视频或任何东西,我什至无法使其工作......

问题

有没有人遇到过类似的问题,并找到了一种解决方案来只记录这个特定的@Composable而不阻塞UI线程?

人造人 科特林 android-jetpack-compose 可组合

评论

2赞 CommonsWare 10/20/2023
除媒体投影 API 之外,任何解决方案都可能导致相当低的帧速率。这是可以接受的吗?
1赞 Kolay 10/20/2023
我想现在任何不使用媒体投影的结果都是可以接受的。或者,即使有一种方法只能使用媒体投影来记录@Composable功能,也欢迎使用。
1赞 CommonsWare 10/20/2023
欢迎您查看官方解决方案以及使用协程快速连续执行其中许多操作的讨论。您还可以查看此库此库此库是否会有所帮助。
1赞 CommonsWare 10/20/2023
但是,如果您的目标是捕获它,并且这是“相机预览视图”,那么这些方法都不太可能奏效。您尝试录制包含“相机预览视图”的视频这一事实表明,您正在尝试通过此技术从包含叠加层的相机创建视频......捕获位图可能不是该问题的最佳解决方案。AndroidView()AndroidView()
0赞 Kolay 10/20/2023
哦,@CommonsWare你是对的。虽然我已经看到了你链接的讨论,但你是对的,可能不是最好的解决方案。事实上,我想录制一个视频并申请,让我们称之为“instagram过滤器”。我想如何实时地向用户提供它,但也将其记录下来并保存到文件中。我认为这个问题可能是最好的解决方案,但最好单独录制视频并在之后应用叠加层......非常感谢。

答: 暂无答案