Android Shoutcast: нужна помощь, чтобы играть в ShoutCast Streaming в версии 1.6

Мое приложение воспроизводит ShoutCast Streaming, а целевая ОС - 1.6 и выше. Я применил код из приложения NPR с некоторыми изменениями.

Вот код

mediaPlayer = new MediaPlayer();
mediaPlayer.reset();
mediaPlayer.setDataSource(url);
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
// Log.d(LOG_TAG, "Preparing: " + playUrl);
mediaPlayer.prepareAsync();
mediaPlayer.start();`

Код ничего не воспроизводит на симуляторе или устройстве (тестирование в Samsung Galaxy с 2.1).


Вот сообщение LogCat.

О воспроизведении http://88.191.81.31:8206
12-08 14: 16: 42.229: WARN / MediaPlayer (5520): информация / предупреждение (1, 26)
12-08 14: 16: 42.239: ОШИБКА / PlayerDriver (1870): Команда PLAYER_INIT завершена с ошибкой или информацией PVMFFailure
12-08 14: 16: 42.239: ОШИБКА / MediaPlayer (5520): ошибка (1, -1)
12-08 14: 16: 42.239: WARN / PlayerDriver (1870): PVMFInfoErrorHandlingComplete
12-08 14: 16: 42.259: ОШИБКА / MediaPlayer (5520): запуск вызывается в состоянии 0
12-08 14: 16: 42.259: ОШИБКА / MediaPlayer (5520): ошибка (-38, 0)
12-08 14: 16: 42.299: ИНФОРМАЦИЯ / MediaPlayer (5520): Информация (1,26)
12-08 14: 16: 42.299: ОШИБКА / MediaPlayer (5520): Ошибка (1, -1)
12-08 14: 16: 42.304 : ОШИБКА / MediaPlayer (5520): Ошибка (-38,0)


Вот вопрос. 1. Можете ли вы сказать мне, что происходит в устройстве? 2. Как решить эту ошибку ?.


person Prasham    schedule 08.12.2010    source источник
comment
Как играть в SHOUTcast? stackoverflow.com/a/8833346/265167   -  person Yaqub Ahmad    schedule 12.01.2012


Ответы (1)


Вы звоните start() слишком рано. Javadocs MediaPlayer объясняют это (посмотрите на картинку):

  1. Либо вам нужно позвонить prepare(), прежде чем позвонить start(), либо

  2. Вы вызываете prepareAsync() и ждете вызова OnPreparedListener.onPrepared(), затем (возможно, внутри этого метода) вызываете start().

Обновлено:

Потоки Shoutcast изначально поддерживаются только в версии 2.2. Для более ранних версий вы должны создать локальный прокси, который изменяет протокол ответа с ICY (shoutcast) на HTTP, который будет поддерживать медиаплеер. Взгляните на это:

http://code.google.com/p/npr-android-app/source/browse/trunk/Npr/src/org/npr/android/news/StreamProxy.java

Это уже обсуждалось ранее:

Слушайте чат на Android

person Peter Knego    schedule 08.12.2010
comment
Я пробовал это. Не работает Вот обновленный код mediaPlayer = new MediaPlayer(); mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); mediaPlayer.setDataSource(url); mediaPlayer.prepareAsync(); mediaPlayer.setOnPreparedListener(new OnPreparedListener() { @Override public void onPrepared(MediaPlayer mp) { Log.i("In", "Prepared Listener"); mediaPlayer.start(); } }); Сообщение LogCat находится в следующем комментарии. - person Prasham; 08.12.2010
comment
WARN / MediaPlayer (6592): информация / предупреждение (1, 26) 12-08 15: 18: 18.214: INFO / MediaPlayer (6592): Info (1,26) 12-08 15: 18: 18.219: ERROR / PlayerDriver ( 1870): команда PLAYER_INIT завершена с ошибкой или информацией PVMFFailure 12-08 15: 18: 18.219: ERROR / MediaPlayer (6592): error (1, -1) 12-08 15: 18: 18.219: ERROR / MediaPlayer (6592) : Ошибка (1, -1) 12-08 15: 18: 18.219: ПРЕДУПРЕЖДЕНИЕ / PlayerDriver (1870): PVMFInfoErrorHandlingComplete - person Prasham; 08.12.2010
comment
Во-первых: prepareAsync() нужно вызывать после setOnPreparedListener(..). Во-вторых: ваша ошибка возникает во время setDataSource(), верно? - person Peter Knego; 08.12.2010
comment
Я считаю, что ваша проблема заключается в том, что 1.6 изначально не поддерживает Shoutcast. Я обновил ответ. - person Peter Knego; 08.12.2010