AndroidでのHLSのサポートのレベルに関していくつかの問題があることに気づきました。私は(できるだけ多くのデバイスで動作するように)小さなビデオプレーヤーのデモを書こうとしています。できれば、サードパーティのライブラリを使用しないでください。 HLSビデオをストリーミングできます。
[〜#〜]注[〜#〜]:現在JellyBean 4.2.2でテストしていますが、他のバージョンにアクセスできます
MediaPlayerクラスを使用して、アプリがストリームの再生を開始できるようにしました(例:Appleのテストビデオ BipBopAll )。ただし、ビデオとしてストリームの間違ったセクションをロードしているようです29分に開始するようです(したがって、約30秒後に終了します)。
私が使用したコードはかなり基本的です:
private void playTrack()
{
player = new MediaPlayer();
try
{
player.setDisplay(holder);
player.setDataSource("http://devimages.Apple.com/iphone/samples/bipbop
/bipbopall.m3u8");
player.prepare();
}
catch (...)
{
}
player.start();
}
更新:私はICS 4.0.4で同じコードをテストしましたが、正しく動作します。3.0でのテスト.1、15分でストリームをロードし、そこから正しく実行されます。
ストリームが最初から始まり、複数のAndroidバージョンで正しく再生されるようにするにはどうすればよいですか?
または、使用すべきより良い実装はありますか?
さらなる調査の結果、他の人がHLSストリーミングをAndroid動作するようにする)のに役立つと思われる次の情報を見つけました。
エンコーディング-ビデオのエンコーディングとセグメンテーションの設定は、ビデオがサポートするAndroidバージョンに大きな影響を与える可能性があります。最終的に、HandBrakeを使用して、次の設定でビデオを作成しました。
Segmentation-Apple MediaFileSegmenterを使用して、「-no-floating-point-duration」と「 -z none "フラグを使用すると、Android 3.0-> 4.2で機能するビデオを作成できました
Gingerbread-Android 2.3でHLSをそのまま使用することはできませんでしたが、 Vitamioライブラリの使用はかなりうまくいきました(詳細は この質問 を参照してください)
Androidの一部のバージョンは http://devimages.Apple.com/iphone/samples/bipbop/bipbopall.m3u8 でHLSをライブHLSではなく、 VOD HLS、つまりメディアプレーヤーは、コンテンツの約29分で、「ライブ」ポイントの近くから始まり、コンテンツの終わりに近くなります。
その理由は次のとおりです。4.3より前では、HLSプレイリストファイルの最後の行は、「\ n」で終わっていなければ解析されませんでした。
そのファイルの変更履歴を参照してください: http://androidxref.com/4.3_r2.1/history/frameworks/av/media/libstagefright/httplive/M3UParser.cpp 、12/31/12、問題を修正した変更があります。この問題は4.4で解消されました。
したがって、古いバージョンの問題を解決する1つの方法は、サーバーのプレイリストの最終行の後に改行を追加するか、アプリにHTTPプロキシを実装して、その改行を効果的に追加することです。
プレーヤーにURLの開始パラメータを指定しようとしましたか?
このような:
" http://devimages.Apple.com/iphone/samples/bipbop/bipbopall.m3u8?start= "
<?xml version="1.0" encoding="utf-8" ?>
- <RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android" Android:orientation="vertical" Android:layout_width="fill_parent" Android:layout_height="fill_parent">
<VideoView Android:id="@+id/surface_view" Android:layout_width="fill_parent" Android:layout_height="300dp" Android:layout_gravity="center" />
<Button Android:id="@+id/button1" Android:layout_width="wrap_content" Android:layout_height="wrap_content" Android:layout_alignParentRight="true" Android:layout_below="@+id/surface_view" Android:layout_marginRight="62dp" Android:layout_marginTop="16dp" Android:text="Stop" />
<Button Android:id="@+id/button" Android:layout_width="wrap_content" Android:layout_height="wrap_content" Android:layout_alignBaseline="@+id/button1" Android:layout_alignBottom="@+id/button1" Android:layout_alignParentLeft="true" Android:layout_marginLeft="34dp" Android:text="Start" />
</RelativeLayout>
*******************************************************************
startB.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mVideoView = (VideoView) findViewById(R.id.surface_view);
mVideoView.setVideoURI(Uri.parse("http://devimages.Apple.com/iphone/samples/bipbop/bipbopall.m3u8"));
mVideoView.setMediaController(new MediaController(MainActivity.this));
mVideoView.requestFocus();
mVideoView.postInvalidateDelayed(100);
new Thread(new Runnable() {
public void run() {
mVideoView.start();
}
}).start();
}
});