【问题标题】:Is it possible to get the resolution of a video in Android?是否可以在 Android 中获得视频的分辨率?
【发布时间】:2011-11-03 19:50:31
【问题描述】:

我正在寻找一种方法来获取 Android 中任何给定视频的分辨率。除了 Android 支持的格式之外,它不必与其他格式一起使用,但如果可以,那就太好了。如果您不确定 Android 支持的格式,请参阅此页面:

http://developer.android.com/guide/appendix/media-formats.html

我认为使用MediaPlayer 类可以做我想做的事,但这似乎非常愚蠢和低效。另外,我想要一种相对快的方法。

我的目标是 Android 3.0+,如果这有什么不同的话。 Honeycomb 也支持 .mkv 文件,但直到 Android 4.0 才正式支持。

【问题讨论】:

    标签: android video android-3.0-honeycomb android-4.0-ice-cream-sandwich


    【解决方案1】:

    您可以使用MediaMetadataRetriever 检索有关视频文件的分辨率信息。您将使用extractMetadata() 方法并使用METADATA_KEY_VIDEO_HEIGHTMETADATA_KEY_VIDEO_WIDTH 常量。所以你会做这样的事情:

    MediaMetadataRetriever metaRetriever = new MediaMetadataRetriever();
    metaRetriever.setDataSource(/* file descriptor or file path goes here */);
    String height = metaRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT);
    String width = metaRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH);
    

    【讨论】:

    • 这看起来绝对很棒!不敢相信我以前从未听说过这门课。非常感谢! :)
    • Pre-Honeycomb 有什么简单的方法吗?
    • MediaMetadataRetriever 需要 API 级别 14
    • 你错了。 API 10 中添加的 MediaMetadataRetriever。如果要检索 API 10 之前的元数据,可以使用 FFmpegMediaMetadataRetriever。
    • 是否返回String类型? int 会更好
    【解决方案2】:

    API 10+ 的技巧:

    MediaMetadataRetriever mRetriever = new MediaMetadataRetriever();
    mRetriever.setDataSource("video_file_path");
    Bitmap frame = mRetriever.getFrameAtTime();
    
    int width = frame.getWidth();
    int height = frame.getHeight();
    

    我们只是简单地从我们的视频中获取一个随机帧并检测它的宽度和高度。

    【讨论】:

      【解决方案3】:

      如果您有视频内容 URI,那么您也可以使用内容提供者查询

      喜欢

          Cursor mediaCursor = getContentResolver().query(
                              videoContentURI,
                              {MediaStore.Video.Media.RESOLUTION}, null, null, null);
              if (mediaCursor != null) {
                          if (mediaCursor.moveToFirst()) {
              //The resolution of the video file, formatted as "XxY"
              String resolution=mediaCursor.getString(mediaCursor
                                        .getColumnIndex(MediaStore.Video.Media.RESOLUTION));
          }
      }
      

      You can check following post to get ContentURI from video Physical Path

      【讨论】:

        【解决方案4】:

        Kotlin 扩展解决方案

        这是在 Kotlin 中获取媒体文件尺寸的方法

        val (width, height) = myFile.getMediaDimensions(context)
        
        fun File.getMediaDimensions(context: Context): Pair<Int, Int>? {
            if (!exists()) return null
            val retriever = MediaMetadataRetriever()
            retriever.setDataSource(context, Uri.parse(absolutePath))
        
            val width = retriever.extractMetadata(METADATA_KEY_VIDEO_WIDTH).toIntOrNull() ?: return null
            val height = retriever.extractMetadata(METADATA_KEY_VIDEO_HEIGHT).toIntOrNull() ?: return null
        
            retriever.release()
            return Pair(width, height)
        }
        

        如果您想让它更安全(Uri.parse 可能会抛出异常),请使用此组合。其他的通常也很有用:)

        fun String?.asUri(): Uri? {
            try {
                return Uri.parse(this)
            } catch (e: Exception) {
            }
            return null
        }
        
        val File.uri get() = absolutePath.asUri()
        
        fun File.getMediaDimensions(context: Context): Pair<Int, Int>? {
            if (!exists()) return 0
            val retriever = MediaMetadataRetriever()
            retriever.setDataSource(context, uri)
        
            val width = retriever.extractMetadata(METADATA_KEY_VIDEO_WIDTH).toIntOrNull() ?: return null
            val height = retriever.extractMetadata(METADATA_KEY_VIDEO_HEIGHT).toIntOrNull() ?: return null
        
            retriever.release()
            return Pair(width, height)
        }
        

        这里没有必要,但通常有用的附加 Uri 扩展

        val Uri?.exists get() = if (this == null) false else asFile().exists()
        
        fun Uri.asFile(): File = File(toString())
        

        【讨论】:

          猜你喜欢
          • 2022-01-27
          • 2018-07-04
          • 1970-01-01
          • 1970-01-01
          • 2015-11-02
          • 1970-01-01
          • 2020-02-19
          • 2015-01-01
          • 1970-01-01
          相关资源
          最近更新 更多