¿Cómo puedo reproducir un flujo de audio HTTP en directo en MediaPlayer en Android?

Quiero reproducir un flujo HTTP en directo en mi aplicación para Android, por lo que instalé el Codificador 9 de Windows Media en otro PC en la misma LAN y lo usé para crear un flujo de audio HTTP en directo.

La transmisión HTTP en directo está bien: la he probado y puede ser reproducida por Windows Media Player o VLC en una PC y puede ser reproducida por VLC para Android en mi móvil.

Por lo tanto, en mi aplicación para Android, escribí este código:

private MediaPlayer player = null; @Override public void onCreate(Bundle savedInstanceState) { StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder() .detectDiskReads() .detectDiskWrites() .detectNetwork() // or .detectAll() for all detectable problems .penaltyLog() .build()); StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder() .detectLeakedSqlLiteObjects() //.detectLeakedClosableObjects() .penaltyLog() .penaltyDeath() .build()); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btnPlay = (Button)findViewById(R.id.play); address = (TextView)findViewById(R.id.address); btnPlay.setOnClickListener(new OnClickListener() { public void onClick(View v) { play(); } }); } private void play() { String serverIp; serverIp = address.getText().toString(); // get the uri address, for example http://xxx.xxx.xxx.xxx:2340 if (player == null) { player = new MediaPlayer(); } else { player.stop(); player.reset(); } try { Log.v("", "Init a new MediaPlayer"); player.setAudioStreamType(AudioManager.STREAM_MUSIC); Log.v("", "Set the stream type to STREAM_MUSIC"); player.setDataSource(this, Uri.parse(serverIp)); Log.v("", "Set the source is " + serverIp); player.setOnBufferingUpdateListener(this); player.setOnPreparedListener(this); player.setOnErrorListener(this); player.prepareAsync(); Log.v("", "After prepareAsync"); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block Log.v("IllegalArgumentException", e.toString()); } catch (SecurityException e) { // TODO Auto-generated catch block Log.v("SecurityException", e.toString()); } catch (IllegalStateException e) { // TODO Auto-generated catch block Log.v("IllegalStateException", e.toString()); } catch (IOException e) { // TODO Auto-generated catch block Log.v("IOException", e.toString()); } catch (Exception e) { Log.v("Exception",e.toString()); } } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_main, menu); return true; } @Override public void onPrepared(MediaPlayer mp) { // TODO Auto-generated method stub try { Log.v("onPrepared", "After prepareAsync"); mp.start(); } catch (Exception e) { Log.v("play", e.toString()); } } @Override public void onBufferingUpdate(MediaPlayer mp, int percent) { // TODO Auto-generated method stub Log.v("onBufferingUpdate", "Buffering Update"); } @Override public boolean onError(MediaPlayer mp, int what, int extra) { // TODO Auto-generated method stub Log.v("MediaPlayer onError", "what=" + what + " extra=" + extra); return true; } 

Pero no funcionó. Cuando hago clic en el botón de reproducción, no pasa nada. Pero si introdujo alguna otra URL que encontré en Internet (por ejemplo, http://www.example.com/song.mp3 ), funciona.

¿Puede alguien ayudarme? La información del registro está abajo. Mi móvil es HTC s710e, y mi versión de Android es 4.0.4.

 11-20 22:28:14.137: V/(580): Init a new MediaPlayer 11-20 22:28:14.137: V/(580): Set the stream type tp STREAM_MUSIC 11-20 22:28:14.147: D/MediaPlayer(580): Couldn't open file on client side, trying server side 11-20 22:28:14.178: E/Trace(39): error opening trace file: No such file or directory (2) 11-20 22:28:14.178: V/(580): After prepareAsync 11-20 22:28:14.297: V/ChromiumHTTPDataSource(39): connect on behalf of uid 10044 11-20 22:28:14.339: I/qtaguid(39): Tagging socket 27 with tag 3f500000000(1013) for uid 10044 failed errno=-2 11-20 22:28:14.629: I/ChromiumHTTPDataSourceSupport(39): Server responded with http status 400 11-20 22:28:14.648: I/qtaguid(39): Untagging socket 27 failed errno=-2 11-20 22:28:14.657: I/AwesomePlayer(39): mConnectingDataSource->connect() returned -1004 11-20 22:28:14.657: E/MediaPlayer(580): error (1, -1004) 11-20 22:28:14.667: E/MediaPlayer(580): Error (1,-1004) 11-20 22:28:14.667: V/MediaPlayer onError(580): what=1 extra=-1004 

Puede jugar HLS en android 3.0and 3.0 + versión, las versiones anteriores no soportan HLS. Este código a continuación, puede trabajar en la versión 3.0 +. Para reproducir video de toda la versión de android que tiene que utilizar rtsp streaming o http prograssive descarga.

Clase del jugador

 import android.app.Activity; import android.media.MediaPlayer; import android.media.MediaPlayer.OnBufferingUpdateListener; import android.media.MediaPlayer.OnCompletionListener; import android.media.MediaPlayer.OnPreparedListener; import android.media.MediaPlayer.OnVideoSizeChangedListener; import android.os.Bundle; import android.util.Log; import android.view.SurfaceHolder; import android.view.SurfaceView; public class VideoPlayerActivity extends Activity implements OnBufferingUpdateListener, OnCompletionListener, OnPreparedListener, OnVideoSizeChangedListener, SurfaceHolder.Callback { private static final String TAG = "MediaPlayerDemo"; private int mVideoWidth; private int mVideoHeight; private MediaPlayer mMediaPlayer; private SurfaceView mPreview; private SurfaceHolder holder; private String path; private Bundle extras; private static final String MEDIA = "media"; private static final int STREAM_VIDEO = 5; private boolean mIsVideoSizeKnown = false; private boolean mIsVideoReadyToBePlayed = false; /** * * Called when the activity is first created. */ @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); setContentView(R.layout.main); mPreview = (SurfaceView) findViewById(R.id.VideoView); holder = mPreview.getHolder(); holder.addCallback(this); holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); extras = getIntent().getExtras(); } private void playVideo(Integer Media) { doCleanUp(); try { path = "http://www.pocketjourney.com/downloads/pj/video/famous.3gp"; // Create a new media player and set the listeners mMediaPlayer = new MediaPlayer(); mMediaPlayer.setDataSource(path); mMediaPlayer.setDisplay(holder); mMediaPlayer.prepare(); mMediaPlayer.setOnBufferingUpdateListener(this); mMediaPlayer.setOnCompletionListener(this); mMediaPlayer.setOnPreparedListener(this); mMediaPlayer.setOnVideoSizeChangedListener(this); //mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); } catch (Exception e) { Log.e(TAG, "error: " + e.getMessage(), e); } } public void onBufferingUpdate(MediaPlayer arg0, int percent) { Log.d(TAG, "onBufferingUpdate percent:" + percent); } public void onCompletion(MediaPlayer arg0) { Log.d(TAG, "onCompletion called"); } public void onVideoSizeChanged(MediaPlayer mp, int width, int height) { Log.v(TAG, "onVideoSizeChanged called"); if (width == 0 || height == 0) { Log.e(TAG, "invalid video width(" + width + ") or height(" + height + ")"); return; } mIsVideoSizeKnown = true; mVideoWidth = width; mVideoHeight = height; if (mIsVideoReadyToBePlayed && mIsVideoSizeKnown) { startVideoPlayback(); } } public void onPrepared(MediaPlayer mediaplayer) { Log.d(TAG, "onPrepared called"); mIsVideoReadyToBePlayed = true; if (mIsVideoReadyToBePlayed && mIsVideoSizeKnown) { startVideoPlayback(); } } public void surfaceChanged(SurfaceHolder surfaceholder, int i, int j, int k) { Log.d(TAG, "surfaceChanged called"); } public void surfaceDestroyed(SurfaceHolder surfaceholder) { Log.d(TAG, "surfaceDestroyed called"); } public void surfaceCreated(SurfaceHolder holder) { Log.d(TAG, "surfaceCreated called"); playVideo(STREAM_VIDEO); } @Override protected void onPause() { super.onPause(); releaseMediaPlayer(); doCleanUp(); } @Override protected void onDestroy() { super.onDestroy(); releaseMediaPlayer(); doCleanUp(); } private void releaseMediaPlayer() { if (mMediaPlayer != null) { mMediaPlayer.release(); mMediaPlayer = null; } } private void doCleanUp() { mVideoWidth = 0; mVideoHeight = 0; mIsVideoReadyToBePlayed = false; mIsVideoSizeKnown = false; } private void startVideoPlayback() { Log.v(TAG, "startVideoPlayback"); holder.setFixedSize(mVideoWidth, mVideoHeight); mMediaPlayer.start(); } } 

XML principal

  <VideoView android:id="@+id/VideoView" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="1"/> <LinearLayout android:id="@+id/linearLayout1" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" android:layout_weight="1" android:background="#aaaaaa"> </LinearLayout> </LinearLayout> 

Y tienes que añadir a tu permiso de Internet de manifiesto

 uses-permission android:name="android.permission.INTERNET" /> 
  • Problemas de almacenamiento intermedio con android.media.MediaPlayer
  • ¿Cómo permitir a los usuarios ver y reproducir canciones en Android a las que ya tienen acceso (por ejemplo, a través de Google Play)?
  • Detener / liberar Mediaplayer en onDestory () hace que NullPointerException
  • Reproductor de medios Android Reiniciar audio después de llamar a Stop
  • RTP en Android MediaPlayer
  • Reproductor multimedia android muestra audio pero no video
  • Android Media Player no se detuvo
  • Android Problemas al reproducir archivos de audio
  • Reproducción de audio de MediaStore en un reproductor de medios Android
  • Reproductor multimedia mediaplayer (658): error (1, -2147483648)
  • ¿Cómo obtener la frecuencia de muestreo y la frecuencia del archivo de música (MP3) en android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.