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

Posted

技术标签:

【中文标题】根据视频宽度和高度旋转屏幕【英文标题】:Rotate screen depending on video width and height 【发布时间】:2017-11-13 07:59:27 【问题描述】:

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

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

    

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

【问题讨论】:

这更像是一种解决方法,但我认为它应该可以工作:***.com/a/9077712/1568530 @VladMatvienko 谢谢,我会试试这个。 @VladMatvienko 你能看看我的编辑吗? 如果您的宽度和高度正确,请检查调试。这完全是另一个问题,应该作为另一个问题提出。 @VladMatvienko 好的,我会问一个新问题 【参考方案1】:

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

我最初方法的问题:

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内部调用。

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

【讨论】:

以上是关于根据视频宽度和高度旋转屏幕的主要内容,如果未能解决你的问题,请参考以下文章

旋转屏幕后ImageView的宽度和高度返回0 [重复]

怎样用 JavaScript 准确获取手机屏幕的宽度和高度

Android:当视图改变方向时切换高度和宽度

如何在快速屏幕旋转后获得视图的高度?

UIImage 大小(宽度和高度)在旋转后减小

iOS- 获取本地视频宽度高度分辨的问题(普通百度的答案有问题)