Подтвердить что ты не робот

Android MediaPlayer занимает много времени для подготовки и буферизации

Мое приложение занимает много времени для подготовки и буферизации аудиопотока. Я прочитал этот вопрос Почему так долго требуется, чтобы MediaPlayer для Android подготовил некоторые потоки в прямом эфире для воспроизведения?, однако он просто говорит, что люди столкнулись с этой проблемой, укажите, как улучшить проблему.

Я испытываю это во всех версиях Android, протестированных с 2.2 - 4.1.2.

Потоки имеют подходящую скорость передачи данных для мобильного и 3G-соединения. Один и тот же поток занимает менее секунды, чтобы начать буферизацию в эквивалентном приложении iOS.

Есть ли способ указать количество времени, которое должно быть буферизовано? Я знаю, что приложение Radio Tune In предлагает эту функцию (https://play.google.com/store/apps/details?id=tunein.player).

Спасибо.

Изменить: я снова проверил и обнаружил, что это происходит только на устройствах, на которых работает Gingerbread и выше ( >= 2.3). Я знаю, что Android изменил базовую структуру от OpenCore до StageFright. Итак, как я могу оптимизировать медиа-инфраструктуру? Похоже, что старый HTC Wildfire может готовить, транслировать и играть, буквально в 10 раз быстрее, чем новый HTC One X и Nexus 7.

4b9b3361

Ответ 1

Я много месяцев боролся с этим вопросом. Наконец, я нашел решение.

Реальная проблема заключается в реализации класса MediaPlayer. В частности, MediaPlayer поддерживает буферизацию данных. Вот почему решение состоит в том, чтобы создать собственную буферизацию, сохранить ее в временном файле и передать ее MediaPlayer.

Этот учебник и исходный код объясняют, как именно. http://androidstreamingtut.blogspot.nl/2012/08/custom-progressive-audio-streaming-with.html

Приспосабливая этот код, легко создать гораздо лучший потоковый проигрыватель.

Разработчики Google действительно испорчены здесь.

EDIT: Этот ответ довольно старый. В настоящее время я бы рекомендовал не использовать MediaPlayer и вместо этого использовать ExoPlayer. Он расширяемый, стабильный и может воспроизводить множество различных типов носителей. Вы можете найти его здесь: https://github.com/google/ExoPlayer/

Ответ 2

На самом деле мало что можно сделать, так как класс Android MediaPlayer не обеспечивает доступ к более низким настройкам уровня, например размер буфера. Единственная альтернатива - сделать ваш собственный плеер с помощью AudioTrack и библиотеки, например FFmpeg, для декодирования.

Ответ 3

Единственное, что я рекомендую, - это поиграть с кодировкой. Например, для MP4 убедитесь, что MOOV Atom находится в начале файла (есть вопросы по S/O относительно того, как это сделать с помощью ffmpeg и т.д.). В MP3 файлах вы можете посмотреть, например, на различные кодеки или битрейты.

Вы можете, например, попробовать несколько аудиофайлов, которые вы найдете в Интернете, и если вы видите тот, который не занимает много времени, чтобы буферизировать, попробуйте закодировать ваши файлы таким же образом.