Is it possible to get the resolution of a video in Android?
You can use the MediaMetadataRetriever to retrieve resolution information about a video file. You'd use the extractMetadata() method and using the METADATA_KEY_VIDEO_HEIGHT
and METADATA_KEY_VIDEO_WIDTH
constants. So you'd do something like this:
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);
Kotlin Extension Solution
Here is the way to fetch media file dimensions in 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)
}
If you want to make it safer (Uri.parse could throw exception), use this combination. The others are generally just useful as well :)
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)
}
Not necessary here, but generally helpful additional Uri extensions
val Uri?.exists get() = if (this == null) false else asFile().exists()
fun Uri.asFile(): File = File(toString())
Trick for API 10+:
MediaMetadataRetriever mRetriever = new MediaMetadataRetriever();
mRetriever.setDataSource("video_file_path");
Bitmap frame = mRetriever.getFrameAtTime();
int width = frame.getWidth();
int height = frame.getHeight();
We are simple taking a random frame from our video and detecting its width and height.
If you have Video Content URI then you can also use content provider query
Like
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