我正在开发一款视频录制应用程序,在该应用程序中,我想录制肖像视频。一切似乎都很好,除了视频是保存在横向模式。我以这个项目https://github.com/HofmaDresu/AndroidCamera2Sample为例尝试了这个实现,但视频仍然保存在横向模式中。
void PrepareMediaRecorder()
{
if (mediaRecorder == null)
{
mediaRecorder = new MediaRecorder();
}
else
{
mediaRecorder.Reset();
}
var map = (StreamConfigurationMap)characteristics.Get(CameraCharacteristics.ScalerStreamConfigurationMap);
if (map == null)
{
return;
}
videoFileName = GetVideoFilePath();
mediaRecorder.SetAudioSource(AudioSource.Mic);
mediaRecorder.SetVideoSource(VideoSource.Surface);
mediaRecorder.SetOutputFormat(OutputFormat.Mpeg4);
mediaRecorder.SetOutputFile(videoFileName);
mediaRecorder.SetVideoEncodingBitRate(10000000);
mediaRecorder.SetVideoFrameRate(30);
var videoSize = ChooseVideoSize(map.GetOutputSizes(Java.Lang.Class.FromType(typeof(MediaRecorder))));
mediaRecorder.SetVideoEncoder(VideoEncoder.H264);
mediaRecorder.SetAudioEncoder(AudioEncoder.Aac);
mediaRecorder.SetVideoSize(videoSize.Width, videoSize.Height);
int rotation = (int)Activity.WindowManager.DefaultDisplay.Rotation;
mediaRecorder.SetOrientationHint(GetOrientation(rotation));
mediaRecorder.Prepare();
}
发布于 2020-12-05 00:08:10
假设有一个高质量的视频播放器向您展示纵向的视频(如果不是这样,您的GetOrientation方法可能有误),但是您仍然关心的其他播放器却卡在了横向:
你必须自己旋转这些框架。不幸的是,这很混乱,因为据我所知,在媒体编码器API上没有对此进行自动控制。
可选的方法是通过ImageReader从摄像头接收帧,然后在Java或JNI语言中进行旋转,在本地代码中,然后通过ImageWriter发送帧到MediaRecorder或MediaCodec表面,或者通过MediaCodec的ByteBuffer接口写入帧。
或者,您可以通过SurfaceTexture将帧发送到图形处理器,在片段着色器中旋转,然后再次写入绑定到媒体录像机/媒体编解码器的表面。
不幸的是,这两者都需要大量的样板代码和对低级细节的理解。
https://stackoverflow.com/questions/65145313
复制相似问题