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

Я хочу получить высоту и ширину видео, для этого я использую класс MediaMetadataRetriever. Это работает правильно для большинства случаев, но в некоторых случаях высота и ширина корпуса меняются местами.

Я думаю, что это может происходить из-за смены ориентации.

Мой текущий код:

MediaMetadataRetriever metaRetriever = new MediaMetadataRetriever();
        metaRetriever.setDataSource(videoPath);
        videoHeight = metaRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT);
        videoWidth = metaRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH);

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

2 ответа

Я пытался выяснить это сам в течение последнего дня или около того, мне в конечном итоге пришлось решить это экспериментально.

            File file = new File(path);
            if (file.exists()) {
                MediaMetadataRetriever retriever = new MediaMetadataRetriever();
                retriever.setDataSource(file.getAbsolutePath());
                String metaRotation = retriever.extractMetadata(METADATA_KEY_VIDEO_ROTATION);
                int rotation = metaRotation == null ? 0 : Integer.parseInt(metaRotation);
                Log.i("Test", "Rotation = " + rotation);
            }

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

Спасибо за ответ Кейта. Вот полный метод Java.

          void getWidthAndHeightOfVideo(String filePath) {


    MediaMetadataRetriever retriever = new MediaMetadataRetriever();
    retriever.setDataSource(filePath);

    String metaRotation = retriever.extractMetadata(METADATA_KEY_VIDEO_ROTATION);
    int rotation = metaRotation == null ? 0 : Integer.parseInt(metaRotation);
    
    String widthString = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH);
    String heightString = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT);
    
    if (rotation == 90 || rotation == 270) {
        videoWidth = Integer.parseInt(heightString);
        videoHeight = Integer.parseInt(widthString);
    } else {
        videoWidth = Integer.parseInt(widthString);
        videoHeight = Integer.parseInt(heightString);
    }
    
    Log.e(TAG, "getWidthAndHeightOfVideo: " + videoHeight + " AA " + videoWidth);
    
    try {
        retriever.release();
    } catch (IOException e) {
        throw new RuntimeException(e);
    }

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