Начиная с Android 4.0+, видео MKV поддерживаются, как описано здесь . Но, как сказал @Peter Knego, формат видеокодека и формат контейнера - это две разные вещи.
Android Media API, похоже, плохо документирован (или, по крайней мере, это было во время вопроса), так как другие парни уже указали здесь . Однако, используя подсказки из этого поста и этого ответа Мне удалось получить обе информации из двух примеров видео:
Uri videoUri = Uri.parse("android.resource://"
+ getPackageName() + "/" + R.raw.sample_video);
// Codec Format
extractor = new MediaExtractor();
extractor.setDataSource(this, videoUri, null);
for (int i = 0; i < extractor.getTrackCount(); i++) {
MediaFormat format = extractor.getTrackFormat(i);
String mime = format.getString(MediaFormat.KEY_MIME);
if (mime.startsWith("video/")) {
Log.d(TAG, "CODEC: " + mime);
break;
}
}
// Container Format
MediaMetadataRetriever mmr = new MediaMetadataRetriever();
mmr.setDataSource(this, videoUri);
Log.d(TAG, "CONTAINER: "
+ mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_MIMETYPE));
Из двух разных видео MKV я получил следующие результаты:
D/VideoActivity: CODEC: video/mp4v-es
D/VideoActivity: CONTAINER: video/x-matroska
D/VideoActivity: CODEC: video/avc
D/VideoActivity: CONTAINER: video/x-matroska
Хотя я думаю, что наилучшим подходом для обработки неподдерживаемых файлов может быть использование try/catch
блоков и / или VideoView.setOnErrorListening
( doc & пример ), кто-то может использовать вышеуказанные методы для перед воспроизведением извлеките больше информации из мультимедиа или, по крайней мере, запишите, что произошло, если что-то пошло не так.