¿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.
- Android: ¿Cómo configurar el volumen de MediaPlayer mediante programación?
- Cómo desarrollar un simple reproductor de audio streaming android?
- Android - Múltiple, transmisión simultánea de audio
- Media Player inicio parada inicio
- Cargar un MediaPlayer desde un Uri en un contexto de activos
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
- ¿Cómo implementar un reproductor de audio para Android usando MediaPlayer y MediaController?
- MediaPlayer piensa aac * archivo de audio es un archivo de vídeo?
- Android2.x: Código de error de MediaPlayer (1, -19)
- Android: Reproducción y grabación simultánea de vídeo
- La reproducción de una canción tras otra provoca un error en MP3Extractor
- Reproductor de medios de Android devuelve IllegalStateException
- ¿Cómo continúan los reproductores de medios de Android la reproducción de canciones cuando se cierra la aplicación?
- VideoView: IllegalStateException en MediaPlayer.getVideoWidth
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" />
- Android Video deja de reproducirse después de varias reproducciones Error 1, 2147483648
- Cómo hacer entradas manifiestas especiales para intel xdk android plugin