我写了一个演示来使用 MediaCodec 和 MediaMuxer 录制视频。
我用我的demo录制了一段视频,用ffprobe查看视频,结果如下:
Duration: 00:00:06.86, start: 0.000000, bitrate: 723 kb/s
Stream #0:0(eng): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 320x240, 619 kb/s, SAR 1:1 DAR 4:3, 30.02 fps, 30 tbr, 90k tbn, 180k tbc (default)
Metadata:
creation_time : 2015-06-05 13:19:24
handler_name : VideoHandle
Stream #0:1(eng): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, mono, fltp, 96 kb/s (default)
Metadata:
creation_time : 2015-06-05 13:19:24
handler_name : SoundHandle
Run Code Online (Sandbox Code Playgroud)
它包含视频和音频信息,我发现音频属性与我在源代码中设置的相同,但视频属性不正确。我的视频设置源码如下:
MediaFormat format = MediaFormat.createVideoFormat(MIME_TYPE, mWidth, mHeight);
format.setInteger(MediaFormat.KEY_COLOR_FORMAT,
MediaCodecInfo.CodecCapabilities.COLOR_FormatSurface);
format.setInteger(MediaFormat.KEY_BIT_RATE, 384000); …Run Code Online (Sandbox Code Playgroud) 我使用MediaRecorder录制视频。使用后置摄像头时,它可以正常工作,但是使用前置摄像头时,捕获的视频被翻转/反转。这意味着右侧的项目将出现在左侧。摄像头预览可以正常工作,只是最终捕获的视频翻转了。
这是相机预览的样子
但是最终的视频看起来像这样(所有项目都出现在左侧,出现在右侧)
到目前为止我尝试过的是:
我尝试使用“ matrix准备记录器”,但似乎并没有改变。
private boolean prepareRecorder(int cameraId){
//# Create a new instance of MediaRecorder
mRecorder = new MediaRecorder();
setCameraDisplayOrientation(this,cameraId,mCamera);
int angle = getVideoOrientationAngle(this,cameraId);
mRecorder.setOrientationHint(angle);
if(cameraId == Camera.CameraInfo.CAMERA_FACING_FRONT){
Matrix matrix = new Matrix();
matrix.preScale(1.0f,-1.0f);
}
//all other code to prepare recorder here
}
Run Code Online (Sandbox Code Playgroud)
我已经在下面阅读了所有此问题,但似乎所有这些SurfaceView都未能解决我的问题。有关信息,我使用的是相机预览,所以这里的问题无济于事。
所以我的问题是:
1)如何通过前置摄像头捕获视频,而不是反向视频(与摄像头预览完全相同)?
2)如何在SurfaceView不使用相机预览的情况下实现此目的TextureView?(因为我上面提到的所有问题,告诉有关使用TextureView)
欢迎所有可能的解决方案..Tq
编辑
我制作了2个简短的视频片段以阐明问题,请下载并查看