9

この次のソース コード スニペットが提供されます。

videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
        @Override
        public void onPrepared(MediaPlayer mediaPlayer) {

            mediaPlayer.setOnInfoListener(new MediaPlayer.OnInfoListener() {
                @Override
                public boolean onInfo(MediaPlayer mp, int what, int extra) {
                    if (what == MediaPlayer.MEDIA_INFO_BUFFERING_END){
                        activity.dismissDialog(DialogID.DIALOG_LOADING);
                        return true;
                    } 
                    return false;
                }
            });
        }
    });

Android 3.x 以降のデバイスで HLS ストリームをストリーミングしており、バッファリングが完了したら読み込みダイアログを非表示にしようとしています。ビデオ ストリーミングは機能しますが、情報イベントは発生しません。

何か案は?

4

7 に答える 7

2

そうです、イベントが発生することはありません。これは HLS の既知のバグであり、Google が修正するとは思えません。

これは、onInfo およびバッファリング イベントに適用されます。

https://code.google.com/p/android/issues/detail?id=42767およびhttps://code.google.com/p/googletv-issues/issues/detail?id=2を参照してください。

ごめん!

于 2013-08-07T04:39:55.000 に答える
2

OPが何を求めているのか完全にはわかりませんが、非常に時期尚早な情報がいくつかあります.

私は onPrepared に依存しません。信頼できないと思います。

MediaPlayer を介した HLS ストリーミングで最も役立つ 2 つの情報は、動画の長さと動画の進行位置です。進行状況の更新をリッスンすることで、これらの両方を取得できます。

デュレーションが 0 より大きい場合、ビデオが本当に準備されており、操作 (スクラブ) できることがわかります。進行位置が変わると、ビデオのバッファリングが完了し、再生が開始されたことがわかります。この最後の項目は、もちろんビデオの再生中にのみ機能します。MediaPlayer は、不正確な情報を中継する傾向があります。

これらの情報はほとんど正確であり、通常は「かなり」タイムリーであると信頼できます。この適時性は、デバイスによって異なります。

于 2013-10-23T03:25:12.890 に答える
1

onPreparedMediaPlayerビデオが完全にバッファリングされたときではなく、 がバッファリングを開始する準備ができたときに呼び出されます。ただし、onPreparedメソッド内から読み込みダイアログを閉じるのはまったく自然なことです。

がバッファを埋めた後に再生を再開するときにMEDIA_INFO_BUFFERING_END使用されるため、ダイアログを閉じるために使用するべきではないと思います。したがって、これは機能するはずです:MediaPlayer

videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
    @Override
    public void onPrepared(MediaPlayer mediaPlayer) {
        activity.dismissDialog(DialogID.DIALOG_LOADING);
    }
});
于 2012-11-07T21:32:04.050 に答える
0

setOnInfoListener を経由する必要はありません

setOnPreparedListener メソッドをオーバーライドするだけで十分です。APIショーのように

public void setOnPreparedListener (MediaPlayer.OnPreparedListener l)

メディア ファイルが読み込まれ、準備が整ったときに呼び出されるコールバックを登録します。

したがって、setOnPreparedListener メソッド内でダイアログを閉じることができます。

このような

    vv.setOnPreparedListener(new OnPreparedListener() {
    @Override
    public void onPrepared(MediaPlayer mp) {

            handler.post(new Runnable() {
            @Override
        public void run() {
                Toast.makeText(MainActivity.this, "finish11", Toast.LENGTH_LONG).show();
        }
        });
        }
    });
于 2012-11-06T09:10:59.323 に答える
0

オブジェクトであるため、videoView に OnPreparedListener を設定できますが、VideoViewのソースをチェックアウトすると、mMediaPlayer がそのプライベート メンバーであることがわかり、外部からの変更は適用されません。

要件に応じて、バッファリングステータスが必要なので、スレッドまたはハンドラーなどを使用できるため、UIを更新してバッファステータスを取得できます.1つの方法があります

int percent = videoView.getBufferPercentage();

if(percent == 100){
// buffering done 
} 
于 2012-11-01T12:23:29.210 に答える
0

バッファリングのたびに読み込みを表示したい場合 (最初の時間または後続のバッファ アンダーラン)、再度表示するようにしてください。

// at the beginning
show

boolean onInfo(int what, int extra) {
  switch (what) {
    case MEDIA_INFO_BUFFERING_END:
      "hide";
      break;
    case MEDIA_INFO_BUFFERING_START
      "show":
  }
}

したがって、このイベント シーケンスは必要に応じて実行されます。

- whenever you start (setVideoURI or start): show
- onPrepared: just plug the info listener
- onInfo BUFFERING_END   hide (it's playing)
- onInfo BUFFERING_START show (it's buffering again)
- onInfo BUFFERING_END   hide (it's playing)

アップデート:

これは、情報イベントが機能することを前提としています。もちろん。

于 2014-07-02T14:50:27.160 に答える