Android 2.2 MediaPlayer отлично работает с одним URL-адресом SHOUTcast, но не с другим.

Пожалуйста, посмотрите код, который я использую для потоковой передачи потока shoutcast, он работает с одним URL-адресом, но НЕ с другим.

Этот работает:

Uri myUri = Uri.parse("http://fr3.ah.fm:9000/");

Но не с этим:

Uri myUri =  Uri.parse("http://someOtherURL");

SimpleMusicStream.java

import android.app.Activity;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;

public class SimpleMusicStream extends Activity implements
  MediaPlayer.OnCompletionListener, MediaPlayer.OnPreparedListener,
  MediaPlayer.OnErrorListener, MediaPlayer.OnBufferingUpdateListener {

 private String TAG = getClass().getSimpleName();
 private MediaPlayer mp = null;

 private Button play;
 private Button pause;
 private Button stop;

 @Override
 public void onCreate(Bundle icicle) {
  super.onCreate(icicle);
  setContentView(R.layout.main);

  play = (Button) findViewById(R.id.play);
  pause = (Button) findViewById(R.id.pause);
  stop = (Button) findViewById(R.id.stop);

  play.setOnClickListener(new View.OnClickListener() {
   public void onClick(View view) {
    play();
   }
  });

  pause.setOnClickListener(new View.OnClickListener() {
   public void onClick(View view) {
    pause();
   }
  });

  stop.setOnClickListener(new View.OnClickListener() {
   public void onClick(View view) {
    stop();
   }
  });
 }

 private void play() {
  Uri myUri = Uri.parse("http://fr3.ah.fm:9000/");
  try {
   if (mp == null) {
    this.mp = new MediaPlayer();
   } else {
    mp.stop();
    mp.reset();
   }
   mp.setDataSource(this, myUri); // Go to Initialized state
   mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
   mp.setOnPreparedListener(this);
   mp.setOnBufferingUpdateListener(this);

   mp.setOnErrorListener(this);
   mp.prepareAsync();

   Log.d(TAG, "LoadClip Done");
  } catch (Throwable t) {
   Log.d(TAG, t.toString());
  }
 }

 @Override
 public void onPrepared(MediaPlayer mp) {
  Log.d(TAG, "Stream is prepared");
  mp.start();
 }

 private void pause() {
  mp.pause();
 }

 private void stop() {
  mp.stop();

 }

 @Override
 public void onDestroy() {
  super.onDestroy();
  stop();

 }

 public void onCompletion(MediaPlayer mp) {
  stop();
 }

 public boolean onError(MediaPlayer mp, int what, int extra) {
  StringBuilder sb = new StringBuilder();
  sb.append("Media Player Error: ");
  switch (what) {
  case MediaPlayer.MEDIA_ERROR_NOT_VALID_FOR_PROGRESSIVE_PLAYBACK:
   sb.append("Not Valid for Progressive Playback");
   break;
  case MediaPlayer.MEDIA_ERROR_SERVER_DIED:
   sb.append("Server Died");
   break;
  case MediaPlayer.MEDIA_ERROR_UNKNOWN:
   sb.append("Unknown");
   break;
  default:
   sb.append(" Non standard (");
   sb.append(what);
   sb.append(")");
  }
  sb.append(" (" + what + ") ");
  sb.append(extra);
  Log.e(TAG, sb.toString());
  return true;
 }

 public void onBufferingUpdate(MediaPlayer mp, int percent) {
  Log.d(TAG, "PlayerService onBufferingUpdate : " + percent + "%");
 }

    }

main.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
 xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="fill_parent"
 android:layout_height="fill_parent">
 <Button
  android:text="Play"
  android:id="@+id/play"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"></Button>
 <Button
  android:text="Pause"
  android:id="@+id/pause"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"></Button>
 <Button
  android:text="Stop"
  android:id="@+id/stop"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"></Button>
</LinearLayout>

Кот в журнале показывает ошибки:

NuHTTPDataSource(33): Server did not give us the content length!

Media Player Error: Unknown (1) -2147483648
Media Player Error: Unknown (1) -1002

Может ли кто-нибудь помочь мне это исправить?

РЕДАКТИРОВАТЬ:

Просто чтобы поделиться с вами, что наш текущий код работает с Android 2.1 и младшими версиями, но не работает с Android 2.2 и выше.

Спасибо


person Yaqub Ahmad    schedule 30.12.2011    source источник
comment
Судя по быстрому поиску в Google, кодирование звука audio/aacp вызывает головную боль и у других.   -  person harism    schedule 30.12.2011
comment
Еще одно действительно хорошее обсуждение можно найти здесь: stackoverflow .com / questions / 1650983 /.   -  person poitroae    schedule 07.01.2012
comment
Не могли бы вы поделиться со мной исходным кодом для ShoutCast URL Streaming Andriod?   -  person IceCream Sandwitch    schedule 30.04.2013


Ответы (5)


Потоковая передача Shoutcast в формате mp3 с Android 2.2 и выше поддерживается изначально.

Ниже 2.2 ОС Android не может воспроизводить потоки shoutcast изначально без использования прокси на конце потока или класса прокси потока на устройстве для захвата потока и передачи его в аудиоплеер, как NPR делает.

потоковая передача аудио / aacp напрямую не поддерживается. Для этого вы можете использовать библиотеку ffmpeg, opencore или faad2, чтобы декодировать его в PCM и воспроизводить с помощью audiotrack. Справочник

person Santhosh Shettigar    schedule 11.01.2012
comment
Потоки Shoutcast поддерживаются начиная с версии 2.2, я знаю это, но почему он работает с одним URL-адресом и не работает с другим? - person Yaqub Ahmad; 12.01.2012
comment
Как я уже сказал, Android 2.2 поддерживает только потоковую передачу mp3 Shoutcast. Один из ваших URL-адресов имеет тип содержимого audio / aacp, который, я думаю, не воспроизводится, другой - audio / mpeg, который поддерживается в Android 2.2 и новее. Для AACP вы либо сохраняете контент в файл, а затем воспроизводите, либо используете любые библиотеки декодирования, о которых я упоминал ... Но также учитывайте юридические проблемы при их использовании. - person Santhosh Shettigar; 12.01.2012
comment
@SanthoshShettigar помогите мне в этом stackoverflow.com/questions/16264225 / - person String; 29.04.2013

проблема заключается в кодировании в audio / aacp

Проблема в том, что aacp не отображается в Android Media Player должным образом. Вам придется попробовать какой-нибудь другой кодек или написать свой собственный декодер.

person the100rabh    schedule 06.01.2012
comment
пожалуйста, помогите мне в этом stackoverflow.com/questions/16264225/ @ the100rabh - person String; 29.04.2013

Mediaplayer поддерживает только эти форматы, указанные в документах разработчика Android.

Некоторые потоки могут удовлетворить это, а некоторые нет.

person sonu thomas    schedule 10.01.2012

Существует бесплатный декодер Advanced Audio (AAC) для Android. Вы можете использовать это для справки и руководства или использовать в нем класс Multiplayer для воспроизведения аудио в формате aac. В нем есть образец приложения и библиотека, которые помогут вам разобраться. Я использовал эту библиотеку для воспроизведения онлайн-трансляций Shoutcast. Я играл и в AAC, и в MP3, используя класс Multiplayer из библиотеки.

Надеюсь это поможет

person Sheraz Ahmad Khilji    schedule 20.04.2013

Наконец, у меня есть простое приложение для потоковой передачи shoutcast. Попробуйте это. Просто измените URL-адрес потоковой передачи в StreamService.java.

person B M    schedule 22.01.2016