VideoView触发preparedListener为时过早HLS为时过早、VideoView、preparedListener、HLS

2023-09-06 13:42:44 作者:ゞ 斑驳的流年、无法释怀

我想告诉用户一些ProgressDialog,而他等待VideoView开始播放HLS。我尝试使用在preparedListener这一点,但他触发提前(后玩家下载M3U8文件,而不是当视频开始)。

I want to show user some ProgressDialog while he waits for VideoView to start play HLS. I try to use OnPreparedListener for this, but he triggers to early (after player downloaded m3u8 file, not when video started).

VideoView player = (VideoView) findViewById(R.id.player);
String httpLiveUrl = "http://example.com/playlist.m3u8";

player.setVideoURI(Uri.parse(httpLiveUrl));
player.setMediaController(new MediaController(this));
player.requestFocus();

player.setOnPreparedListener(new OnPreparedListener() {
public void onPrepared(MediaPlayer mp) {
    progress.dismiss();
}
});

progress.show();
player.start();

我没有找到其他合适的听者......可能是任何人都知道SLOUTION?

I didn't find another suitable listner... May be anyone knows sloution?

推荐答案

感谢所有。我解决了我的问题,接下来黑客:

Thanks to all. I solved my problem with next hack:

videoView.setOnPreparedListener(new OnPreparedListener() {
    public void onPrepared(MediaPlayer mp) {

        final Handler handler = new Handler();
        videoPositionThread = new Runnable() {
             public void run() {
                try {
                    int duration = videoView.getCurrentPosition();
                    if (!(videoPosition == duration && videoView.isPlaying())) {
                        progress.dismiss();
                    }
                    videoPosition = duration;
                    handler.postDelayed(videoPositionThread, 1000);
                } catch (IllegalArgumentException e) {
                    Log.d(TAG, e.getMessage(), e);
                }
            }
        };
        handler.postDelayed(videoPositionThread, 0);
    }
});