Android 2.2 MediaPlayer is working fine with one SHOUTcast URL but not with the other one

ε祈祈猫儿з 提交于 2019-11-26 03:34:40

问题


Please see the code i am using for streaming shoutcast stream, it works with one URL but NOT with the other one.

This one works:

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

But not with this one:

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>

The Log-cat shows errors:

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

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

Can someone help me to fix it?

EDIT:

Just to share with you people, that our current code works with Android 2.1 & minor versions, but not works with Android 2.2 or higher.

Thanks


回答1:


Shoutcast mp3 streaming from Android 2.2 onwards is supported natively .

Below 2.2 the Android OS cannot play shoutcast streams natively without using a proxy on the stream end or a stream proxy class on the device to capture the stream and pass it to the audioplayer just like NPR does.

audio/aacp streaming is not supported directly . For this you can use ffmpeg, opencore or faad2 library to decode it into PCM and play using audiotrack .Reference




回答2:


problem is encoding in audio/aacp

Problem is that aacp is not rendered by Android Media Player properly. You will have to try some other codec or write your own decoder.




回答3:


Mediaplayer supports only these formats as given in the android developer documents.

Some streams may be satisfying this,but some will not




回答4:


There is a Freeware Advanced Audio (AAC) Decoder for Android. You can use this for help and Guidance or use Multiplayer class in it to playback aac audio. There is a sample app and library in it to help you understand. I have used this library to play Shoutcast online Streams. I played both AAC and MP3 using Multiplayer class provided in the library

Hope this helps




回答5:


Finally, i got simple shoutcast streaming app. Try this. Just change streaming url in StreamService.java.



来源:https://stackoverflow.com/questions/8681550/android-2-2-mediaplayer-is-working-fine-with-one-shoutcast-url-but-not-with-the

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!