Возможно ли получить разрешение видео в Android?

Я ищу способ получить разрешение любого видео в Android. Он не должен работать с другими форматами, кроме поддерживаемых в Android, но было бы замечательно, если бы он работал. Если вы не уверены в поддерживаемых форматах в Android, обратитесь к этой странице:

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

Я думаю, что можно делать то, что я хочу, используя MediaPlayer класс, но это кажется невероятно глупым и неэффективным. Кроме того, я хотел бы, чтобы это было относительно быстро.

Я нацеливаюсь на Android 3.0+, если это что-то меняет. Honeycomb также поддерживает файлы.mkv, хотя официально не поддерживается до Android 4.0.

3 ответа

Решение

Вы можете использовать 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);

Трюк для API 10+:

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

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

Мы просто берем случайный кадр из нашего видео и определяем его ширину и высоту.

Если у вас есть 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));
    }
}

Вы можете проверить следующий пост, чтобы получить Content URI из видео Physical Path

Kotlin Extension Solution

Вот способ получить размеры медиафайлов в 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())
Другие вопросы по тегам