Streaming de Audio desde UNA dirección URL en Android utilizando MediaPlayer?

He estado tratando de flujo de mp3 a través de http con Android integrado en la clase MediaPlayer. La documentación que se sugieren para mí que esto debería ser tan fácil como :

MediaPlayer mp = new MediaPlayer();
mp.setDataSource(URL_OF_FILE);
mp.prepare();
mp.start();

Sin embargo estoy obteniendo el siguiente repetidamente. He intentado diferentes URLs así. Por favor no me digas que la transmisión no funciona en mp3.

E/PlayerDriver(   31): Command PLAYER_SET_DATA_SOURCE completed with an error or info PVMFErrNotSupported
W/PlayerDriver(   31): PVMFInfoErrorHandlingComplete
E/MediaPlayer(  198): error (1, -4)
E/MediaPlayer(  198): start called in state 0
E/MediaPlayer(  198): error (-38, 0)
E/MediaPlayer(  198): Error (1,-4)
E/MediaPlayer(  198): Error (-38,0)

Cualquier ayuda que se agradece mucho, gracias
S

  • Un par de preguntas: (1) que el SDK de la versión estás usando? (2) dispositivo(s) está en pruebas? Esto funciona bien en el SDK 2.0.1, las pruebas en un Droid.
  • Hola Roman, gracias por tomarse el tiempo. Estoy tratando de que este en contra de 1.6 y estoy usando un HTC Hero. Voy a probarlo en 2.01 en la luz de sus comentarios, pero sería un ridículo resultado si esto sólo trabajó en 2.x y y por encima de los dispositivos fuera de la caja.
  • Sólo lo intentó en un 2.01 emulador. No funciona por desgracia. Estoy intrigado para tratar este en contra de un verdadero 1.6 dispositivo y un real 2.01 dispositivo. Estoy en exámenes de Google en el 4to. Tal vez voy a tener que esperar hasta entonces. Yo preferiría no tener que pesar.
  • Yo no sospecha 2.0 vs 2.0.1 va a hacer ninguna diferencia, pero emulador de vs en vivo dispositivo puede hacer una diferencia. Me sorprende que esto no funciona en el Héroe. Voy a mirar en él y ver si puedo conseguir una mejor respuesta. Oh, también, como una comprobación de validez, usted debe asegurarse de que se ha solicitado el permiso de INTERNET en el manifiesto.
  • Hola acaba de salir de la discusión tengo una pregunta. Si yo uso mp.setDataSource(URL_OF_FILE); no necesitamos guardar cualquier archivo para el streaming de audio. ¿No es así? De manera de que su la mejor manera de transmitir audio desde cualquier ubicación. Alguna idea?
  • Traté de streaming de audio utilizando setDataSource(contexto,uri); Se desempeña bien en el 2.01/emulador. Hace 1.6 apoyo a este?
  • Romano, sí, estoy seguro de tener el permiso de INTERNET.
  • Bohemio, lo kin dof URI di usas? Asumo que sabes la diferencia entre una URL y URI? Si usted hizo llegar a trabajar mediante un URI ¿me puede mostrar cómo se construye su URI, gracias. Nota: estoy tratando de golpear a un URL remoto no algún tipo de local URI del archivo a pesar de que estoy totalmente de aceptar que cuold trabajo con una distancia de URI.

InformationsquelleAutor Pandalover | 2009-12-27

7 Kommentare

  1. 76

    sencillo Reproductor Multimedia con streaming ejemplo.Para la parte de xml necesita un botón con id button1 y dos imágenes en su dibujable carpeta con el nombre button_pause y button_play y por favor no olvide añadir el permiso de internet en el manifiesto.

    public class MainActivity extends Activity {
    private Button btn;
    /**
     * help to toggle between play and pause.
     */
    private boolean playPause;
    private MediaPlayer mediaPlayer;
    /**
     * remain false till media is not completed, inside OnCompletionListener make it true.
     */
    private boolean intialStage = true;
    
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btn = (Button) findViewById(R.id.button1);
        mediaPlayer = new MediaPlayer();
        mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
        btn.setOnClickListener(pausePlay);
    
    }
    
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        //Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }
    
    private OnClickListener pausePlay = new OnClickListener() {
    
        @Override
        public void onClick(View v) {
            //TODO Auto-generated method stub
            //TODO Auto-generated method stub
    
            if (!playPause) {
                btn.setBackgroundResource(R.drawable.button_pause);
                if (intialStage)
                    new Player()
                            .execute("http://www.virginmegastore.me/Library/Music/CD_001214/Tracks/Track1.mp3");
                else {
                    if (!mediaPlayer.isPlaying())
                        mediaPlayer.start();
                }
                playPause = true;
            } else {
                btn.setBackgroundResource(R.drawable.button_play);
                if (mediaPlayer.isPlaying())
                    mediaPlayer.pause();
                playPause = false;
            }
        }
    };
    /**
     * preparing mediaplayer will take sometime to buffer the content so prepare it inside the background thread and starting it on UI thread.
     * @author piyush
     *
     */
    
    class Player extends AsyncTask<String, Void, Boolean> {
        private ProgressDialog progress;
    
        @Override
        protected Boolean doInBackground(String... params) {
            //TODO Auto-generated method stub
            Boolean prepared;
            try {
    
                mediaPlayer.setDataSource(params[0]);
    
                mediaPlayer.setOnCompletionListener(new OnCompletionListener() {
    
                    @Override
                    public void onCompletion(MediaPlayer mp) {
                        //TODO Auto-generated method stub
                        intialStage = true;
                        playPause=false;
                        btn.setBackgroundResource(R.drawable.button_play);
                        mediaPlayer.stop();
                        mediaPlayer.reset();
                    }
                });
                mediaPlayer.prepare();
                prepared = true;
            } catch (IllegalArgumentException e) {
                //TODO Auto-generated catch block
                Log.d("IllegarArgument", e.getMessage());
                prepared = false;
                e.printStackTrace();
            } catch (SecurityException e) {
                //TODO Auto-generated catch block
                prepared = false;
                e.printStackTrace();
            } catch (IllegalStateException e) {
                //TODO Auto-generated catch block
                prepared = false;
                e.printStackTrace();
            } catch (IOException e) {
                //TODO Auto-generated catch block
                prepared = false;
                e.printStackTrace();
            }
            return prepared;
        }
    
        @Override
        protected void onPostExecute(Boolean result) {
            //TODO Auto-generated method stub
            super.onPostExecute(result);
            if (progress.isShowing()) {
                progress.cancel();
            }
            Log.d("Prepared", "//" + result);
            mediaPlayer.start();
    
            intialStage = false;
        }
    
        public Player() {
            progress = new ProgressDialog(MainActivity.this);
        }
    
        @Override
        protected void onPreExecute() {
            //TODO Auto-generated method stub
            super.onPreExecute();
            this.progress.setMessage("Buffering...");
            this.progress.show();
    
        }
    }
    
    @Override
    protected void onPause() {
        //TODO Auto-generated method stub
        super.onPause();
        if (mediaPlayer != null) {
            mediaPlayer.reset();
            mediaPlayer.release();
            mediaPlayer = null;
        }
    }
    • Hay un ligero problema con esto, si me bloqueo mi teléfono mientras el MediaPlayer es jugando, mi aplicación se bloquea cuando me desbloquearlo.
    • He intentado comentar la «mediaPlayer.release()» de la línea en onPause(), y ahora mi aplicación no se bloquee al desbloqueo.
    • esta característica es aceptado por el desarrollador de la consola? Como mi aplicación es obtener rechazado b’coz he utilizado Vitamio 4.x versión
  2. 35

    Android MediaPlayer no soporta streaming de MP3 de forma nativa hasta 2.2. En versiones anteriores de OS parece secuencia sólo 3GP de forma nativa. Usted puede probar la pocketjourney código, aunque es antiguo (hay un nueva versión aquí) y he tenido problemas para hacer pegajoso — que tartamudean cuando a llenar el buffer.

    De la NPR, la aplicación de Noticias para Android es de código abierto y utiliza un servidor proxy local para manejar MP3 streaming en las versiones del sistema operativo antes de 2.2. Usted puede ver el código correspondiente en las líneas de 199-216 (r94) aquí: http://code.google.com/p/npr-android-app/source/browse/Npr/src/org/npr/android/news/PlaybackService.java?r=7cf2352b5c3c0fbcdc18a5a8c67d836577e7e8e3

    Y este es el StreamProxy clase: http://code.google.com/p/npr-android-app/source/browse/Npr/src/org/npr/android/news/StreamProxy.java?r=e4984187f45c39a54ea6c88f71197762dbe10e72

    La NPR aplicación es también sigue recibiendo el error «(-38, 0)» a veces, mientras que el streaming. Esto puede ser un problema subprocesamiento o un cambio de la red cuestión. Compruebe la gestor de actualizaciones.

    • Está usted absolutamente seguro acerca de esto? Mi entendimiento es que esto tiene que ver con el tipo mime. Podría usted comprobar si t funciona con el tipo MIME correcto pre 2.1? Estoy trabajando en algo ahora y no podía comprobar por un tiempo.
    • De acuerdo a la versión 2.2 notas (developer.android.com/sdk/android-2.2-highlights.html), que incluye un «Nuevo marco de las redes (Stagefright) que soporta la reproducción de archivo local y progresiva de HTTP streaming». En todas mis pruebas era incapaz de obtener un dispositivo 2.1 para transmitir desde un servidor shoutcast directamente. Yo creo que el problema es que los servidores de shoutcast devolver un protocolo de HIELO/1.1 en lugar de HTTP/1.1 y el reproductor de medios de los viajes en esto ya que no sabe cómo responder a ese contenido.
    • ¿qué pasa si los archivos de audio se pueden descargar una vez y que el usuario puede reproducir los archivos sin conexión demasiado?
    • No sé si se puede guardar el archivo mientras se está transmitiendo con el actual jugador de medios de implementación (esta respuesta es casi cinco años y mucho ha cambiado desde 2.2). Si nada más, se podría construir un proxy siguiendo este ejemplo y escribir el archivo de almacenamiento, mientras que pasa a través del proxy.
  3. 10

    Supongo que usted está intentando reproducir un .pls directamente o algo similar.

    intenta esto:

    1: el código

    mediaPlayer = MediaPlayer.create(this, Uri.parse("http://vprbbc.streamguys.net:80/vprbbc24.mp3"));
    mediaPlayer.start();

    2: la .pls archivo

    Esta es la URL de la BBC sólo como un ejemplo. Se trataba de un .pls archivo en linux he descargado con

    wget http://foo.bar/file.pls

    y, a continuación, abrí con vim (use su editor favorito 😉 y he visto a la real URLs dentro de este archivo. Por desgracia, no todos los .pls son de texto simple como eso.

    He leído que el 1.6 no soporte de streaming de mp3 a través de http, pero, sólo he probado la obove código con android 1.6 y 2.2, y no tenía ningún problema.

    buena suerte!

    • Recuerde que si usted quiere transmitir la música que usted tiene que utilizar mediaplayer.prepareAsync y no mediaplayer.preparar. Por lo tanto, usted no puede utilizar mediaplayer.crear (), porque ninguno de los .crear funciones() toma su Reproductor de Medios objeto directamente en el estado Preparado, a partir de la cual usted no puede llamar a prepareAsync, que tiene que con el fin de transmitir. developer.android.com/reference/android/media/MediaPlayer.html
  4. 4

    Uso

     mediaplayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
     mediaplayer.prepareAsync();
     mediaplayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
          @Override
          public void onPrepared(MediaPlayer mp) {
              mediaplayer.start();
          }
     });
  5. 2

    He tenido el mismo error que usted tiene y resultó que no había nada malo con el código. El problema era que el servidor web envía el mal encabezado de Tipo de Contenido.

    Trate de wireshark o algo similar para ver qué tipo de contenido que el servidor web está enviando.

    • para los archivos de formato mp3 debe ser Content-Type: audio/mpeg Que resolver mi problema 🙂
    • ¿Cómo transmitir ese archivo ?
  6. 1

    No llame mp.empezar con un OnPreparedListener para evitar el cero en el estado i en el registro..

    • Todavía se me pone la línea de registro 05-22 20:26:13.625: E/MediaPlayer(23818): parada » en el estado 0 a pesar de que yo inicie mi Reproductor de Medios en el preparado de la función (). Yo también tengo una onError función de donde puedo restablecer el Reproductor de Medios objeto. Todavía tarda hasta 2 minutos para mi stream para empezar a jugar. Ver a mi pregunta aquí: stackoverflow.com/questions/16672568/…

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea