Android Camera2 API — видео всегда сохраняется в альбомной ориентации

#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 с включенной опцией обрезки. Спасибо за поддержку!