Не Используйте Mediaplayer И Mediametadataretriever В Android.

Как показывает мой скромный опыт, нативные 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

Вместе с данным постом часто просматривают: