Как показывает мой скромный опыт, нативные MediaPlayer, MediaMetadataRetriever, а также другие классы, так или иначе основанные на них (VideoView, ThumbnailUtils, например), крайне ненадежны в использовании.
Возможно, проблема в том, что они реализованы изначально и меняются от версии к версии, но факт остается фактом: их поведение на разных устройствах невозможно предугадать, и это даже не зависит от мощности железа.
Хорошим примером был небольшой проект, где нужно было реализовать воспроизведение видео.
Вы можете выбрать любой формат и кодек; Я проводил тесты на mp4 и avi с различными кодеками.
На всех попавшихся под руку устройствах воспроизведение шло гладко и без нареканий.
Не было необходимости поддерживать старые устройства и версии ОС.
<4.0, and I thought that there would be no problems with these formats. Then on HTC desire V it was discovered that several videos could not be played, as well as the built-in player in the gallery. There was an idea that the device was rather weak, but the surprise was that almost no test videos were played on the Nexus 5 at all. At least I couldn’t find any pattern - even with the same codecs, one file could be read, but the other could not. The files were not damaged, so the only problem was the VideoView with MediaPlayer inside. К счастью, есть хорошие альтернативы, которые работают не только надежнее, но и быстрее:
- библиотека FFmpeg. Вы можете скомпилировать его самостоятельно, используя Android NDK. Ладно, но минусы такого подхода очевидны — нужно разбираться в NDK, билде, а это можно сделать только под Linux. Я не хотел тратить на это время.
- FFmpegMediaPlayer. Собственно, она основана на первой библиотеке, но собирать ее не нужно, и уже предусмотрен интерфейс, полностью аналогичный родному MediaPlayer. Чисто для тестирования попробовал использовать, но на SurfaceView почему-то видео не отрисовывалось, при этом точно такой же код, но с родным MediaPlayer работал без проблем.
Возможно, это была моя ошибка, но быстрого решения я не нашел.
(UPD: Как отмечено в комментариях, эта библиотека предназначена только для аудио)
- Витамио.
Он также берет за основу FFmpeg и также предоставляет готовые сборки.
При этом у него также есть свои VideoView и MediaMetadataRetriever, с интерфейсом, похожим на нативный Android SDK, что существенно упрощает жизнь при создании плеера.
Можно использовать свои собственные сборки FFmpeg; он поддерживает ОС 2.1+ и почти все форматы.
Остановился на этой библиотеке, никаких проблем с ней не возникло.
Обратите внимание, что сборка изначально не содержит сборки для x86. Также следует ожидать, что с этой библиотекой ваш APK увеличится примерно на 8 мегабайт.
- Есть и другие варианты, большинство из них используют тот же FFmpeg, но Vitamio меня полностью устроил.
Кто-то может не согласиться и сказать, что у него и так все хорошо работает. Здесь мы можем только рекомендовать тестирование на большем количестве файлов и устройств.
например, с помощью Genymotion. Теги: #Android #mediaplayer #MediaMetadataRetriever #ffmpeg #Vitamio #Разработка Android
-
Малликен, Роберт Сэндерсон
19 Oct, 24 -
История Одного Бага
19 Oct, 24 -
Бизнес По-Русски
19 Oct, 24 -
«Но Я Не Бегаю По Залам Ожидания»
19 Oct, 24