Android CameraX如何旋转输出视频
Android CameraX how to rotate output video
我使用以下版本的 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 数据旋转时的视频。
我使用以下版本的 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 而不是相机预览的解码视频正是问题所在,相机预览工作正常。