【问题标题】:How to determine video width and height on Android如何在 Android 上确定视频的宽度和高度
【发布时间】:2012-02-23 01:08:51
【问题描述】:

我有一个视频文件,我想获取视频的宽度和高度。我不想玩它,只是为了获得大小。 我尝试使用 MediaPlayer:

MediaPlayer mp = new MediaPlayer();
mp.setDataSource(uriString);
mp.prepare();
int width = mp.getVideoWidth();
int height = mp.getVideoHeight();

但它返回 0 的宽度和高度,因为 VideoSizeChangedEvent 尚未触发。 如何获取视频的宽度和高度?

UPD:我需要 API 版本 7

【问题讨论】:

    标签: android video media-player android-videoview


    【解决方案1】:

    Kotlin 版本?

    data class VideoSize(val width: Int, val height: Int)
    

    扩展功能

    fun Uri.getVideoSize(): VideoSize {
            val retriever = MediaMetadataRetriever()
            retriever.setDataSource(appContext, this)
            val width =
                retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH)?.toInt() ?: 0
            val height =
                retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT)?.toInt() ?: 0
            retriever.release()
            return VideoSize(width, height)
        }
    

    【讨论】:

      【解决方案2】:

      在某些情况下,我们无法读取元数据。为了保证我们得到宽高,最好使用MediaMetadataRetriever创建一个Bitmap,然后从创建的Bitmap中获取宽高,如下图:

      public int getVideoWidthOrHeight(File file, String widthOrHeight) {
          MediaMetadataRetriever retriever = null;
          Bitmap bmp = null;
          FileInputStream inputStream = null;
          int mWidthHeight = 0;                                                                                                                
          try {
              retriever = new  MediaMetadataRetriever();
              inputStream = new FileInputStream(file.getAbsolutePath());
              retriever.setDataSource(inputStream.getFD());
              bmp = retriever.getFrameAtTime();
              if (widthOrHeight.equals("width")){
                  mWidthHeight = bmp.getWidth();
              }else {
                  mWidthHeight = bmp.getHeight();
              }
          } catch (FileNotFoundException e) {
              e.printStackTrace();
          } catch (IOException e) {
              e.printStackTrace();
          } catch (RuntimeException e) {
              e.printStackTrace();
          } finally{
             if (retriever != null){
                 retriever.release()
             }if (inputStream != null){
                 inputStream.close()
             }
          }  
          return mWidthHeight;
      }
      

      你可以这样调用上面的方法:

      // Get the video width
      int mVideoWidth = getVideoWidthOrHeight(someFile, "width");
      // Get the video height
      int mVideoHeight = getVideoWidthOrHeight(someFile, "height");
      

      【讨论】:

      • 对不起,我忘了写,我需要 API 版本 7,所以没有 MediaMetadataRetriever
      • 感谢您提供该代码,但是我不知道如何在我的项目的 res/raw 文件夹中为文件获取适当的字符串,有什么建议吗?
      【解决方案3】:

      这个set of utilities 在 Android 中使用 Size 抽象。

      它包含一个类SizeFromVideoFile.java 你可以这样使用它:

      ISize size = new SizeFromVideoFile(videoFilePath);
      size.width();
      size.hight();
      

      【讨论】:

        【解决方案4】:

        这对我有用

        videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                    @Override
                    public void onPrepared(final MediaPlayer mp) {
                        int width = mp.getVideoWidth();
                        int height = mp.getVideoHeight();
                    }
                });
        

        【讨论】:

        • 当从某些 url 应用程序获取视频的高度和宽度时挂起,如果我们无法从视频应用程序获取高度和宽度时也会挂起。
        • 唯一对我有用的东西 - MediaMetadataRetriever 似乎不太了解视频大小...
        【解决方案5】:

        这适用于 API 级别 10 及更高级别:

        MediaMetadataRetriever retriever = new MediaMetadataRetriever();
        retriever.setDataSource("/path/to/video.mp4");
        int width = Integer.valueOf(retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH));
        int height = Integer.valueOf(retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT));
        retriever.release();
        

        【讨论】:

        • @TigranSarkisian 应用在 android 6.0 中会崩溃吗?
        • 它在 API 10 之后工作。但如果路径无效或文件不存在,它会抛出 IllegalArgumentException
        • 适用于 android 7.1
        • 应该使用parseInt() 方法而不是valueOf。无论如何,你拯救了我的一天!
        • retriever.setDataSource 不起作用
        【解决方案6】:

        API 7 级解决方案:

        // get video dimensions
        MediaPlayer mp = new MediaPlayer();
                try {
                    mp.setDataSource(filename);
                    mp.prepare();
                    mp.setOnVideoSizeChangedListener(new OnVideoSizeChangedListener() {
                        @Override
                        public void onVideoSizeChanged(MediaPlayer mp, int width, int height) {
        
                            int orient = -1;
        
                            if(width < height)
                                orient = 1;
                            else
                                orient = 0;
        
                        }
                    });
                } catch (IllegalArgumentException e) {
                    e.printStackTrace();
                } catch (SecurityException e) {
                    e.printStackTrace();
                } catch (IllegalStateException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
        

        【讨论】:

        • 当从某些 url 应用程序获取视频的高度和宽度时挂起,如果我们无法从视频应用程序获取高度和宽度时也会挂起。
        【解决方案7】:
        private static final Uri MOVIE_URI = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
        private static final String[] MOVIE_PJT = new String[] {
                MediaStore.Video.Media._ID, MediaStore.Video.Media.DATA,
                MediaStore.Video.Media.TITLE, MediaStore.Video.Media.DATE_TAKEN,
                MediaStore.Video.Media.MIME_TYPE, MediaStore.Video.Media.DURATION,
                MediaStore.Video.Media.SIZE, MediaStore.Video.Media.RESOLUTION };
        

        试试这个从系统内容提供者那里查询。它会返回一些有用的视频信息(本地文件)

        【讨论】:

        • 至少在某些时候,RESOLUTION 为空。 (我还不确定它什么时候是非空的,但是当RESOLUTION 不可用时,我遇到了这个问题,寻找一种解决方法(在 Gingerbread 及更高版本上,唉)。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-02-03
        • 2018-01-24
        • 1970-01-01
        • 2013-12-06
        • 2023-03-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多