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.

Solutions Collecting From Web of "Android MediaPlayer занимает много времени для подготовки и буферизации"

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

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

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

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

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

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

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

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

Например, вы можете попробовать несколько аудиофайлов, которые вы находите в Интернете, и если вы видите тот, который не занимает много времени для буферизации, попробуйте также закодировать свои файлы.