Android 2.2 MediaPlayer可以正常工作,只有一个SHOUTcast URL,但不能用另一个SHOUTcast URL

请参阅我用于stream式shoutcaststream的代码,它可以使用一个URL,但不能与另一个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> 

Log-cat显示错误:

 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或更高版本 。

谢谢

    Android 2.2以上版本的Shoutcast mp3stream媒体在本地受到支持。

    在2.2以下,Android操作系统不能在stream端使用代理,或者在设备上使用stream代理类来捕获stream,并像NPR一样将其传递给audio播放器。

    audio/ aacpstream不直接支持。 为此,您可以使用ffmpeg,opencore或faad2库将其解码为PCM并使用audiotrack播放。 参考

    问题是编码在audio/ aacp

    问题是,Android媒体播放器无法正确呈现aacp。 您将不得不尝试其他编解码器或编写自己的解码器。

    Mediaplayer仅支持android开发人员文档中给出的这些格式 。

    有些stream可能会满足这个,但有些不会

    有一个免费的高级audio(AAC)解码器为Android 。 您可以使用这个帮助和指导,或使用多人课程播放aacaudio。 有一个示例应用程序和库,以帮助您理解。 我用这个库玩Shoutcast在线Streams。 我使用图书馆提供的多人游戏玩AAC和MP3

    希望这可以帮助

    最后,我得到了简单的shoutcaststream应用程序。 试试这个 。 只需在StreamService.java中更改stream式传输url即可。