Android CameraX如何旋转输出视频

Posted

技术标签:

【中文标题】Android CameraX如何旋转输出视频【英文标题】:Android CameraX how to rotate output video 【发布时间】:2020-09-29 10:10:42 【问题描述】:

我使用以下版本的 CameraX 依赖项:

implementation "androidx.camera:camera-camera2:1.0.0-beta04"
implementation "androidx.camera:camera-view:1.0.0-alpha11"
implementation "androidx.camera:camera-extensions:1.0.0-alpha11"
implementation "androidx.camera:camera-lifecycle:1.0.0-beta04"

并尝试使用 android MediaCodec 将相机的输出视频编码为 H264 并将其解码并在 SurfaceView 上显示结果视频,一切正常,除了 SurfaceView 上的视频在纵向上逆时针旋转 90 度模式并且在横向模式下没有旋转。

我从摄像头捕捉视频的代码如下所示:

private lateinit var yData: ByteArray  //
private lateinit var uData: ByteArray  // store YUV data from camera
private lateinit var vData: ByteArray  //

imageAnalysis = ImageAnalysis.Builder().setBackpressureStrategy ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST).build()
imageAnalysis.setAnalyzer(executor, ImageAnalysis.Analyzer  imageProxy ->
    if (imageProxy.image == null || imageProxy.planes.size < 3) return@Analyzer

    for (i in 0 until 3) 
        val plane = imageProxy.image!!.planes[i]
        val bytes = ByteArray(plane.buffer.remaining())
        plane.buffer.get(bytes)
        when(i) 
            0 -> yData = bytes
            1 -> uData = bytes
            2 -> vData = bytes
        
    
    imageProxy.close()

    // send yData, uData, vData to encoder ...
)

为了解决我尝试使用的问题:imageAnalysis.targetRotation = Surface.ROTATION_0 和其他值,但它根本不起作用 - 解码的视频仍然旋转。

我还尝试使用this 答案旋转从相机获得的 YUV 数据,这次我成功旋转了我的视频,但是视频的颜色突然变暗了,我不知道为什么.. 但是如果我不旋转我的视频,颜色是完美的。

所以我的问题是:如何正确旋转我的视频而不会出现颜色失真?我需要旋转 SurfaceView 的方式不适合我。我重复一遍 - 我首先从相机获取并编码为 H264 的解码视频的问题,而不是来自相机的预览,来自相机的预览工作正常。

这里是我的源视频,没有使用我上面提到的任何方式。

这是我使用 YUV 数据旋转时的视频。

【问题讨论】:

【参考方案1】:

最后我找到了一个解决方案 - 我基于 Google 的 libyuv 库制作了一个 android library,以便从 android Camera2 或 CameraX api 轻松快速地缩放、旋转和镜像帧。

【讨论】:

以上是关于Android CameraX如何旋转输出视频的主要内容,如果未能解决你的问题,请参考以下文章

具有自定义表面的 Android CameraX

Android CameraX - 录制视频时的面部检测

Android CameraX实现摄像头预览拍照录制视频

Android 使用CameraX实现预览/拍照/录制视频/图片分析/对焦/缩放/切换摄像头等操作

Android CameraX 分析图像流

旋转android设备时如何设置全屏视频