我正在寻找一种方法来获取Android中任何给定视频的分辨率。它不必与Android中支持的其他格式一起使用,但如果确实如此,它会很棒。如果您不确定Android中支持的格式,请参阅此页:
http://developer.android.com/guide/appendix/media-formats.html
我认为使用MediaPlayer
类可以做我想做的事情,但这看起来非常愚蠢和低效。另外,我想要一种相对快的方式。
我的目标是Android 3.0+,如果这有任何区别的话。 Honeycomb还支持.mkv文件,虽然直到Android 4.0才正式支持。
答案 0 :(得分:45)
您可以使用MediaMetadataRetriever检索有关视频文件的分辨率信息。您将使用extractMetadata()方法并使用METADATA_KEY_VIDEO_HEIGHT
和METADATA_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);
答案 1 :(得分:3)
API 10 +的诀窍:
MediaMetadataRetriever mRetriever = new MediaMetadataRetriever();
mRetriever.setDataSource("video_file_path");
Bitmap frame = mRetriever.getFrameAtTime();
int width = frame.getWidth();
int height = frame.getHeight();
我们很简单地从视频中随机取出一帧并检测其宽度和高度。
答案 2 :(得分:1)
如果您有视频内容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
答案 3 :(得分:1)
这是在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())