2010-08-29 20 views
11

El marco multimedia Stagefrigh (Android 2.2) es compatible con la transmisión progresiva HTTP.
¿Qué significa eso? Es decir. ¿Es esto una realización del protocolo HTTP Live Streaming?¿Android 2.2 HTTP progresivo de transmisión = HTTP Live Streaming?

Y cómo usar HTTP Live Streaming en Android, me refiero a qué es el cliente: navegador web, MediaPlayer o simplemente la realización de "en SDK" y tengo que heredar de alguna clase?

Respuesta

22

Una gran diferencia práctica es que Stagefright Media Framework es compatible con mpeg3 streaming, que el viejo motor no tenía. Entonces puedes usar (shoutcast) mp3streams por ejemplo.

Aquí hay un ejemplo simple de implementación, que transmite una URL de shoutcast: http://fr3.ah.fm:9000. Tenga en cuenta que esto solo funciona en Android 2.2 y posteriores.

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> 

Leer más http://developer.android.com/guide/topics/media/index.html cheque asíncrono Preparación

+0

¡Muchas gracias por el ejemplo de código! Pero mi pregunta es sobre protocolo. Según tengo entendido, una descarga progresiva significa que puede ver el video mientras el resto del video se carga en el reproductor y almacena en caché los archivos temporales de Internet de los usuarios. Es decir Streaming significa que puede hacer clic en cualquier lugar del video y saltar al lugar donde hizo clic, mientras que progresivo significa que debe esperar a que la barra esté delante del marcador para reproducirlo. Pero, ¿qué es el streaming progresivo? – headwire

+0

En otras palabras, usando Android HTTP Progressive Streaming, ¿podré hacer clic y saltar al segmento descargado? – headwire

+0

Y una pregunta práctica: ¿puedo usar el archivo Apple/stream segmenter para hacer estos archivos "segmentados" para Live Streaming (a través del servidor web Apache) en la plataforma Android? – headwire

3

transmisión HTTP progresiva es como jugar al archivo multimedia en la media hora de descargar el archivo.

No es la realización. Primero, stagefright no contiene ningún controlador de archivo .m3u8. 2nd, stagefright no es compatible con el formato de archivo .ts.

Actualmente, puede volver a implementar su reproductor multimedia para reproducir en vivo.

+0

Entonces, no hay transmisión real. Porque "reproducir archivos multimedia mientras tanto descarga el archivo" y "no hay manejador M3U8" significa la descarga progresiva (http). – headwire

Cuestiones relacionadas