2010-08-29 11 views
11

Platforma nośników Stagefrigh (Android 2.2) obsługuje strumieniowanie progresywne HTTP.
Co to oznacza? To znaczy. to jest realizacja protokołu HTTP Live Streaming?Czy HTTP 2.2 strumieniowanie progresywne = HTTP Live Streaming?

A jak korzystać z HTTP Live Streaming na Androida, mam na myśli to, co jest klientem - przeglądarka internetowa, MediaPlayer lub po prostu "in-SDK" i muszę dziedziczyć z jakiejś klasy?

Odpowiedz

22

Jednym z dużych praktycznych różnic jest to, że platforma nośnika Stagefright obsługuje strumieniowanie MPEG3, którego stary silnik nie obsługuje. Możesz więc użyć np. Mp3castów.

Oto prosty przykład wdrożenia, który przesyła podcast URL: http://fr3.ah.fm:9000. Pamiętaj, że działa to tylko w Androidzie 2.2 i nowszych.

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> 

Czytaj więcej http://developer.android.com/guide/topics/media/index.html wyboru Asynchronous Przygotowanie

+0

Wiele Thanx dla przykładu kodu! Ale moje pytanie dotyczy protokołu. W moim rozumieniu Progressive Download oznacza, że ​​można oglądać wideo, gdy reszta filmu ładuje się do odtwarzacza i zapisuje w tymczasowych plikach internetowych użytkowników. tj. Przesyłanie strumieniowe oznacza, że ​​możesz kliknąć dowolne miejsce w filmie i przeskoczyć do miejsca, w którym kliknąłeś, podczas gdy postępowy oznacza, że ​​musisz poczekać, aż pasek znajdzie się przed znacznikiem, aby go odtworzyć. Ale czym jest Progressive Streaming? – headwire

+0

Innymi słowy, używając Android HTTP Progressive Streaming, czy będę mógł kliknąć i przeskoczyć do rozładowanego segmentu? – headwire

+0

Praktyczne pytanie: czy mogę używać segmentatora plików Apple/Stream do tworzenia tych "segmentowanych" plików do przesyłania strumieniowego na żywo (za pośrednictwem serwera WWW Apache) na platformę Android? – headwire

3

strumieniowe HTTP progresywny jest jak gra plik multimedialny w tym czasie pobierania pliku.

Nie jest realizacja. Po pierwsze, stagefright nie zawiera żadnej obsługi plików .m3u8. Po drugie, stagefright nie obsługuje formatu pliku .ts.

Obecnie można ponownie zaimplementować swój odtwarzacz multimedialny do odtwarzania strumieniowego na żywo.

+0

Nie ma prawdziwego streamingu. Ponieważ "odtwarzanie pliku multimedialnego w średnim czasie pobierania pliku" i "brak programu obsługi M3U8" oznacza pobieranie progresywne (http). – headwire

Powiązane problemy