Android MediaMetadataRetriever获取的视频高度和宽度不正确

13

我想获取视频的高度和宽度,我正在使用MediaMetadataRetriever类。对于大多数情况,它都能正确工作,但是在某些情况下,高度和宽度会互换。

我认为这可能是由于方向变化导致的。

我的当前代码:

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

我该如何获得正确的数值?谢谢


请分享媒体文件。分析文件元数据更有帮助。 - lucky1928
2个回答

18

我自己试了一整天还是没想出来,最后只能试验性地解决了。

            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,宽度和高度将会交换。


0
感谢Keith的回答。这是完整的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);
    }

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接