2010-08-29 5 views
11

Le cadre multimédia Stagefrigh (Android 2.2) prend en charge le streaming progressif HTTP.
Qu'est-ce que cela signifie? C'est à dire. est-ce une réalisation du protocole HTTP Live Streaming?Est-ce que Android 2.2 est un streaming progressif HTTP = HTTP Live Streaming?

Et comment utiliser HTTP Live Streaming sur Android, je veux dire quel est le client - navigateur Web, MediaPlayer ou juste "in-SDK" réalisation et je dois hériter de certains cours?

Répondre

22

Une grande différence pratique est que Stagefright media Framework prend en charge le streaming mpeg3, contrairement à l'ancien moteur. Donc, vous pouvez utiliser (shoutcast) mp3streams par exemple.

Voici un exemple simple de mise en œuvre, qui ruisselle une URL shoutcast: http://fr3.ah.fm:9000. Notez que cela ne fonctionne que sur Android 2.2 et plus.

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> 

En savoir plus http://developer.android.com/guide/topics/media/index.html check Asynchronous Préparation

+0

Beaucoup Merci pour l'exemple de code! Mais ma question concerne le protocole. À mon avis, un téléchargement progressif signifie que vous êtes en mesure de regarder la vidéo pendant que le reste de la vidéo est en cours de chargement dans le lecteur et qu'il est mis en cache dans les fichiers Internet temporaires des utilisateurs. I.e. Le streaming signifie que vous pouvez cliquer n'importe où dans la vidéo et passer à l'endroit où vous avez cliqué, tandis que progressif signifie que vous devez attendre que la barre soit en avance sur le marqueur pour la jouer. Mais qu'est-ce que le streaming progressif? – headwire

+0

En d'autres termes, en utilisant Android HTTP Progressive Streaming, serai-je capable de cliquer et de passer au segment non chargé? – headwire

+0

Et une question pratique: puis-je utiliser Apple file/stream segmenter pour faire ces fichiers "segmentés" pour Live Streaming (via le serveur web Apache) sur la plateforme Android? – headwire

3

streaming HTTP progressive est comme lecture du fichier multimédia dans le même temps le téléchargement du fichier.

Ce n'est pas une réalisation. 1er, stagefright ne contient aucun gestionnaire de fichiers .m3u8. 2ème, stagefright ne supporte pas le format de fichier .ts.

Actuellement, vous pouvez réimplémenter votre lecteur multimédia pour la diffusion en direct.

+0

Donc, il n'y a pas de vrai streaming. Parce que "lire le fichier multimédia en attendant le téléchargement du fichier" et "pas de gestionnaire M3U8" signifie le téléchargement progressif (http). – headwire

Questions connexes