#android #android-camera2
#Android #android-camera2
Вопрос:
Я работаю над приложением для записи видео, в котором я хочу записывать видео в портретном режиме. Все кажется прекрасным, за исключением видео, которое сохраняется в альбомном режиме. Я попробовал реализацию с использованием этого проекта: 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();
}
Комментарии:
1.
SetOrientationHint()
к записанному видео добавляется только мета-флаг, который уважают только некоторые зрители.2. Спасибо, Алекс, у тебя есть идеи, как я могу обойти эту проблему?
Ответ №1:
Предполагая, что высококачественный видеоплеер показывает вам видео в портретной ориентации (если нет, то в вашем методе getOrientation, вероятно, есть ошибка), но другие проигрыватели, которые вам все еще интересны, застряли в альбомной ориентации:
Вам придется поворачивать кадры самостоятельно. К сожалению, это беспорядочно, поскольку в известных мне API-интерфейсах media encoder для этого нет автоматического управления.
Варианты — получение кадров с камеры через программу чтения изображений, а затем выполнение поворота на Java или через JNI в машинном коде, а затем отправка кадра кодировщику либо через ImageWriter на MediaRecorder или MediaCodec Surface, либо запись кадров через интерфейс ByteBuffer MediaCodec.
Или вы можете отправить кадры на графический процессор через SurfaceTexture, повернуть в шейдере фрагмента, а затем снова записать на поверхность, привязанную к MediaRecorder / MediaCodec.
К сожалению, оба они требуют большого количества шаблонного кода и понимания деталей более низкого уровня.
Комментарии:
1. Я действительно исправил это, используя Exoplayer с включенной опцией обрезки. Спасибо за поддержку!