Как я могу обеспечить правильную ориентацию воспроизведения записанного видео?

Я использую MediaStore.ACTION_VIDEO_CAPTURE намерение захватить видео, а затем воспроизвести его с помощью VideoView, Я хотел бы знать ориентацию видео, которое было снято.

Я не хочу использовать ориентацию во время намеренного вызова, потому что пользователь может повернуть устройство до нажатия кнопки спуска затвора. Я также не хочу реализовывать свой собственный захват видео.

Сохраняется ли ориентация видео в сохраненном файле и / или возвращается в результате намерения?

3 ответа

Сохраняется ли ориентация видео в сохраненном файле и / или возвращается в результате намерения?

AOSP VideoCamera активность обеспечивает значение вращения устройства камеры на MediaRecorder.setOrientationHint() метод. Вот выдержка из кода в VideoCamera.initializeRecorder() код, связанный с этим:

    // See android.hardware.Camera.Parameters.setRotation for
    // documentation.
    // Note that mOrientation here is the device orientation, which is 
    // the opposite of what getWindowManager().getDefaultDisplay().getRotation() 
    // would return, which is the orientation the graphics need to rotate 
    // in order to render correctly.
    int rotation = 0;
    if (mOrientation != OrientationEventListener.ORIENTATION_UNKNOWN) {
        CameraInfo info = CameraHolder.instance().getCameraInfo()[mCameraId];
        if (info.facing == CameraInfo.CAMERA_FACING_FRONT) {
            rotation = (info.orientation - mOrientation + 360) % 360;
        } else {  // back-facing camera
            rotation = (info.orientation + mOrientation) % 360;
        }
    }
    mMediaRecorder.setOrientationHint(rotation);

Вот документация для setOrientationHint() Объясняя хранение информации:

Устанавливает подсказку ориентации для воспроизведения выходного видео. Этот метод должен быть вызван перед prepare(). Этот метод не запускает поворот исходного видеокадра во время записи видео, но добавляет матрицу композиции, содержащую угол поворота в выходном видео, если формат вывода - OutputFormat.THREE_GPP или OutputFormat.MPEG_4, чтобы видеопроигрыватель мог выбрать подходящий ориентация для воспроизведения. Обратите внимание, что некоторые видеопроигрыватели могут игнорировать матрицу композиции в видео во время воспроизведения.

Так как вы используете рамки VideoView виджет для воспроизведения видео, он должен уже правильно обрабатывать информацию в матрице композиции, и вам нужно только сравнить ширину и высоту видео, чтобы решить, следует ли установить альбомную или книжную ориентацию для вашей деятельности по воспроизведению. Одним из простых способов сделать это было бы просто позвонить ThumbnailUtils.createVideoThumbnail() (который внутренне использует MediaMetaDataRetriever) и проверьте разрешение возвращенного растрового изображения.

Подобно тому, как ал. предложил в своем ответе, я использую MediaMetadataRetriever но с METADATA_KEY_VIDEO_ROTATION ключ:

MediaMetadataRetriever mediaMetadataRetriever = new MediaMetadataRetriever();
mediaMetadataRetriever.setDataSource( absoluteVideoFilePath );
String orientation = mediaMetadataRetriever.extractMetadata(
         MediaMetadataRetriever.METADATA_KEY_VIDEO_ROTATION );

Я проверил захват видео со всеми 4 различными ориентациями фронтальной камеры, и метаданные всегда разные. Замечания: METADATA_KEY_VIDEO_ROTATION нужен API уровня 17 или выше.

Вы можете использовать MediaMetadataRetriever, чтобы получить ширину и высоту вашего видео и выяснить ориентацию до его загрузки.

Другие вопросы по тегам