根据视频宽度和高度旋转屏幕

时间:2017-11-13 07:59:28

标签: android android-orientation

我目前通过执行以下操作来检测所选视频的宽度和高度:

MediaMetadataRetriever mediaMetadataRetriever = new MediaMetadataRetriever();
    mediaMetadataRetriever.setDataSource(this, mVideoUri);
    String height = mediaMetadataRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT);
    String width = mediaMetadataRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH);

清单中的活动:

<activity android:name=".TrimVideoActivity"
        android:theme="@style/Theme.AppCompat.Light.NoActionBar.FullScreen"
        />

如果我为宽度和高度干杯,无论视频的尺寸如何,它都会返回w : 1920 h : 1080。我认为它正在返回设备的宽度和高度。

我有什么遗漏或做错了吗?

修改

通过关注@VladMatvienko建议的链接,我能够获得视频文件的正确宽度和高度,这就是我实现它的方式:

MediaMetadataRetriever retriever = new MediaMetadataRetriever();
    Bitmap bmp = null;
    retriever.setDataSource(this, mVideoUri);
    bmp = retriever.getFrameAtTime();

    String videoWidth = String.valueOf(bmp.getWidth());
    String videoHeight = String.valueOf(bmp.getHeight());

现在我想根据结果(宽度/高度)旋转屏幕,我通过执行以下操作尝试了它:

int w = Integer.parseInt(videoWidth);
    int h = Integer.parseInt(videoHeight);


    if (w > h) {
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);


    } if(w < h) {
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

    }

但是,当宽度小于高度时,屏幕总是旋转到横向,而不是设置为纵向?

1 个答案:

答案 0 :(得分:0)

我决定添加一个答案,解释我如何解决此问题。

我最初的方法存在的问题:

MediaMetadataRetriever mediaMetadataRetriever = new MediaMetadataRetriever();
mediaMetadataRetriever.setDataSource(this, mVideoUri);
String height = mediaMetadataRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT);
String width = mediaMetadataRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH);

表示视频可能没有我想要的元数据,这将导致nullpointerexception

为避免此问题,我可以通过以下操作从视频中获取一帧(作为位图),并从该位图中获取宽度和高度:

MediaMetadataRetriever retriever = new MediaMetadataRetriever();
Bitmap bmp;
retriever.setDataSource(this, mVideoUri);
bmp = retriever.getFrameAtTime();

但是,这带来了另一个问题,您可能没有。在我的情况下,我想开始第一个/最近的帧,因为如果在捕获视频的过程中旋转了屏幕,那么帧的宽度/高度将发生变化,因此我在{{1 }}。


现在,我可以根据视频文件的宽度和高度旋转屏幕了,

getFrameAtTime(1)

当然,以上内容将从try { MediaMetadataRetriever retriever = new MediaMetadataRetriever(); Bitmap bmp; retriever.setDataSource(this, mVideoUri); bmp = retriever.getFrameAtTime(1); int videoWidth = bmp.getWidth(); int videoHeight = bmp.getHeight(); if (videoWidth > videoHeight) { this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); } if (videoWidth < videoHeight) { this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); } }catch (RuntimeException ex){ Log.e("MediaMetadataRetriever", "- Failed to rotate the video"); } 内部调用。

希望这对外面的人有帮助;)