2012-06-28 3 views
2

(Этот вопрос частично связан с Why does it take so long for Android's MediaPlayer to prepare some live streams for playback?)Android MediaPlayer.prepare() занимает очень много времени для API> 2.3 (Является ли это из-за StageFright?)

Я пытался играть следующий аудиопоток на разных устройствах с android MediaPlayer: http://newsstream1.publicradio.org.

Наконец-то я заметил, что для метода prepare() между устройствами < = 2.2 (требуется менее 1 секунды) существует огромная разница в длительности и устройства> 2.2 (это может занять до 30 секунд ...)

Связано ли это с базовым звуковым каркасом? (OpenCore VS StageFright)

Кто-то уже испытал это? И знаете ли вы какое-нибудь лучшее решение для чтения mp3-потоков с медиаплеером StageFright?

+0

Я не реальный ответ на это, но это поможет ваше приложение будет меньше разочарований для пользователя (http://stackoverflow.com/questions/6582908/why-does- it-take-so-long-for-androids-mediaplayer-to-prepare-some-live-streams/42042218 # 42042218) – LiTTle

ответ

3

Ну, после копания я пришел к выводу, что время загрузки зависит от размера буфера MediaPlayer (который как-то жестко запрограммирован в прошивке) и что ничего не поделаешь, чтобы его изменить.

+0

Удивительный, правый! : | Я тоже застрял в этой проблеме.Мой интернет-аудиопоток воспроизводится мгновенно и идеально на таких устройствах, как Samsung Music, Note, Note II, S II, S III mini и Google Nexus, но на устройстве Samsung S III требуется до 2 минут, и я думаю, что это именно так этого. Мой вопрос здесь: http://stackoverflow.com/questions/16693601/why-does-it-take-longer-for-some-internet-audio-streams-to-start-playing-on-a-sa – marienke

0

Это не должно длиться так долго, но API MediaPlayer имеет метод asyncPrepare(), который они рекомендуют использовать для бесперебойной работы приложения.

+0

Абсолютно. Но я беспокоюсь о времени загрузки (что то же самое, когда сделано в фоновом режиме) – fiddler

+0

, и это несоответствие в времени загрузки согласовано? –

+0

Да, я делал измерения несколько раз, и я всегда получаю эту сильную разницу между устройствами до 2.2 и пост-2.2. – fiddler

1

Кажется, что это буферизация фиксированного количества данных, а не фиксированное количество времени. Для тех, кто не знает битрейта различных типов NPR потоков от верхней части головы, данные выглядит следующим образом:

новости MPR поток: 27 секунд (http://newsstream1.publicradio.org:80/), 64 кбит MPR классическая музыка поток: 15 секунд (http://classicalstream1.publicradio.org:80/), 128 кбит MPR текущего потока: 7 секунд (http://currentstream1.publicradio.org:80/), 128 кбит PRI поток: 52 секунды (http://pri-ice.streamguys.biz/pri1), 32 кбит Помимо расхождения между двумя 128 кбит потоков, есть очень хороший корреляция между битрейтом и продолжительностью буферизации.

В любом случае, Android является открытым исходным кодом, поэтому вы всегда можете посмотреть, что он делает. К сожалению, prepareAsync() и prepare() являются собственными методами, и, похоже, события, связанные с буфером, отправляются также из собственного процесса.

Вы пытались установить OnBufferingUpdateListener на номер MediaPlayer, чтобы получить более мелкие обновления о состоянии буфера? Возможно, было бы интересно сравнить скорость, с которой доставляются события, и в каком проценте буфер заполняется каждым событием в разных потоках. Вы можете перекрестно ссылаться на битрейты потока, и если 4 секунды буферизации со скоростью 32 кбит/с заполняет буфер таким же процентом, как и 1 секунда буферизации со скоростью 128 кбит/с, тогда, я думаю, вы найдете свой ответ.

производный от here.

+0

Я думаю что 'OnBufferingUpdateListener' вызывается только после того, как MediaPlayer подготовлен, поэтому мы не получаем никакой информации, связанной с начальной буферизацией. – fiddler

+0

onBufferingUpdateListener может быть вызван до того, как MediaPlayer будет готов - я вызываю onBufferingUpdateListener перед тем, как подготовитьAync, и я возвращаю результаты. Процент всегда равен 0: \ – marienke

Смежные вопросы