Как получить угол поворота видео, если вращение метаданных неверно?

У меня есть видео файл, я получаю его разрешение (3840x2160) и поворот (0) из следующих кодов:

        MediaMetadataRetriever retr = new MediaMetadataRetriever();
        retr.setDataSource(mVideoFile);
        String height = retr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT);
        String width = retr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH);
        String rotation = retr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_ROTATION);

Но actullay, угол поворота видео в градусах не правильный, он должен быть 90, разрешение 2160x3840, поэтому мое видео всегда не отображалось правильно в моем приложении для Android.

Интересно, что некоторые сторонние видеоплееры (такие как VLC) могут обнаружить фактическое вращение для этого видеофайла, и его отображение также в порядке, как они это сделали?

0 ответов

Слишком поздно, но, вероятно, это поможет будущим посетителям.

Следующая строка вернет вращение видео. Четыре возможных значения будут 0,90,180,270.

rotation = Integer.parseInt(retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_ROTATION));

Если угол поворота равен 90 или 270, ширина и высота будут транспонированы.

Android MediaMetadataRetriever неверная высота и ширина видео

Поэтому проведите пальцем по ширине и высоте, если угол поворота равен 90 или 270.

if(rotation == 90 || rotation == 270)
{ 
 int swipe = width; 
 width = height; 
 height = swipe; 
}

Ниже приводится полный код. Сравниваю результат с MXPlayer, результат такой же.

public static String getVideoResolution(File file)
{
    try
    {
        MediaMetadataRetriever retriever = new MediaMetadataRetriever();
        retriever.setDataSource(file.getPath());
        int width = Integer.parseInt(retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH));
        int height = Integer.parseInt(retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT));
        int rotation = 0;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
            rotation = Integer.parseInt(retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_ROTATION));
        }
        retriever.release();

        if(rotation != 0)
        {
            if(rotation == 90 || rotation == 270)
            {
                int swipe = width;
                width = height;
                height = swipe;
            }
        }

        return width + " x " + height;
    }
    catch (Exception e)
    {
        e.printStackTrace();
        return "Information not found.";
    }
}

Ниже приведен код для настройки ориентации экрана.

int width;
int height;
int rotation = 0;
try {
    MediaMetadataRetriever retriever = new MediaMetadataRetriever();
    retriever.setDataSource(filePath);
    width = Integer.parseInt(retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH));
    height = Integer.parseInt(retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT));

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
        rotation = Integer.parseInt(retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_ROTATION));
    }
    retriever.release();

    if(rotation != 0)
    {
        if(rotation == 90 || rotation == 270)
        {
            int swipe = width;
            width = height;
            height = swipe;
        }
    }
    this.setRequestedOrientation(width < height ? ActivityInfo.SCREEN_ORIENTATION_PORTRAIT : ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
}
catch (Exception e){
    e.printStackTrace();
}

А как насчет устройств, которые работают с версией ниже Build.VERSION_CODES.JELLY_BEAN_MR1?

Ответ: Я не знал. Но приведенный выше код будет работать на большинстве устройств.

Ниже приводится лучший ответ: /questions/29851412/obnaruzhenie-esli-video-byilo-snyato-v-portretnoj-albomnoj-orientatsii/49374758#49374758

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