19

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

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

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

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

4

4 回答 4

50

您可以使用MediaMetadataRetriever检索有关视频文件的分辨率信息。您将使用extractMetadata()方法并使用METADATA_KEY_VIDEO_HEIGHTandMETADATA_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);
于 2011-11-03T19:54:25.680 回答
7

API 10+ 的技巧:

MediaMetadataRetriever mRetriever = new MediaMetadataRetriever();
mRetriever.setDataSource("video_file_path");
Bitmap frame = mRetriever.getFrameAtTime();

int width = frame.getWidth();
int height = frame.getHeight();

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

于 2014-12-12T05:40:16.730 回答
2

如果您有视频内容 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));
    }
}

您可以查看以下帖子以从视频物理路径中获取 ContentURI

于 2017-08-26T07:53:01.430 回答
1

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())
于 2020-05-24T01:32:47.247 回答