web-dev-qa-db-ja.com

Android HLSストリーミング-異なるAndroidバージョンが異なる場所をストリームにロードする

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バージョンで正しく再生されるようにするにはどうすればよいですか?

または、使用すべきより良い実装はありますか?

18
HaemEternal

さらなる調査の結果、他の人がHLSストリーミングをAndroid動作するようにする)のに役立つと思われる次の情報を見つけました。

エンコーディング-ビデオのエンコーディングとセグメンテーションの設定は、ビデオがサポートするAndroidバージョンに大きな影響を与える可能性があります。最終的に、HandBrakeを使用して、次の設定でビデオを作成しました。

  • MP4ファイル
  • H.264;ベースラインプロファイル;レベル3
  • AACオーディオ; 44.1k; 128ビット(:JellyBeanはICS/Honeycombよりもオーディオについて非常にうるさいことがわかりました。一部のオーディオビットレートでは、Jellybeanが再生しないビデオが作成されます一般的に、モノラルおよび低ビットレートのオーディオはジェリービーンでよりよく機能するように思われました。

Segmentation-Apple MediaFileSegmenterを使用して、「-no-floating-point-duration」と「 -z none "フラグを使用すると、Android 3.0-> 4.2で機能するビデオを作成できました

Gingerbread-Android 2.3でHLSをそのまま使用することはできませんでしたが、 Vitamioライブラリの使用はかなりうまくいきました(詳細は この質問 を参照してください)

14
HaemEternal

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プロキシを実装して、その改行を効果的に追加することです。

3
Dino

プレーヤーにURLの開始パラメータを指定しようとしましたか?

このような:

" http://devimages.Apple.com/iphone/samples/bipbop/bipbopall.m3u8?start= "

1
BenjaminH
   <?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();
            }
        });
0
PankajSharma