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



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

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);
    }

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

我决定添加一个答案来解释我是如何解决这个问题的。

我最初方法的问题:

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();

但是,这带来了另一个问题,您可能没有。就我而言,我想获得离开头最近的第一帧/最近的帧,因为如果在捕获视频期间屏幕旋转,那么帧的宽度/高度就会改变,所以我只是在getFrameAtTime(1)中添加了 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");
}

当然,以上内容将从onCreate内部调用。

希望这对那里的人有所帮助。

最新更新