Как получить угол поворота видео, если вращение метаданных неверно?
У меня есть видео файл, я получаю его разрешение (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