2010-08-29 70 views
11

Stagefrigh媒體框架(Android 2.2)支持HTTP漸進式流式傳輸。
這是什麼意思?即這是一個HTTP Live流媒體協議實現?Android 2.2 HTTP漸進式流= HTTP直播流?

如何在Android上使用HTTP Live Streaming,我的意思是什麼是客戶端 - 網頁瀏覽器,MediaPlayer或者只是「in-SDK」的實現,我必須從一些類繼承?

回答

22

一個很大的實際區別是Stagefright媒體框架支持mpeg3流媒體,而舊引擎不支持。因此,您可以使用(shoutcast)mp3streams。

下面是一個簡單的實施示例,它傳播了一個shoutcast URL:http://fr3.ah.fm:9000。請注意,這隻適用於Android 2.2及更高版本。

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> 

更多 http://developer.android.com/guide/topics/media/index.html檢查異步準備

+0

用於代碼示例的Many Thanx! 但我的問題是關於協議。 根據我的理解,漸進式下載意味着您​​可以在視頻的其餘部分加載到播放器的同時觀看視頻,並緩存到用戶的臨時Internet文件中。 也就是說流式播放意味着您可以點擊視頻中的任意位置並跳轉到您點擊的位置,而漸進式播放意味着您必須等待欄杆在標記之前才能播放。 但什麼是漸進式流媒體? – headwire 2010-08-30 12:24:46

+0

換句話說,使用Android HTTP Progressive Streaming,我可以點擊並跳轉到未加載的段? – headwire 2010-08-30 12:27:08

+0

實際問題:我可以使用Apple文件/流分段器在Android平臺上爲Live Streaming(通過Apache Web服務器)製作這些「分段」文件嗎? – headwire 2010-08-30 12:31:51

3

HTTP漸進式流就像打媒體文件的平均時間下載文件。

是不是實現。 1st,stagefright不包含任何.m3u8文件處理程序。 2,stagefright不支持.ts文件格式。

目前,您可以重新實現您的mediaplayer播放直播。

+0

因此,沒有真正的流媒體。因爲「在播放媒體文件的同時下載文件」和「沒有M3U8處理程序」是指漸進式(http)下載。 – headwire 2010-11-01 11:17:47