1

Whenever videoview is playing a video and there is a network connection drop and the video freezes, my code is not throwing an error even though I have set the videoview error listener.

public class MainActivity extends Activity {

static MediaController mc;
static VideoView vw;


/** Called when the activity is first created. */
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
            WindowManager.LayoutParams.FLAG_FULLSCREEN);
    setContentView(R.layout.activity_main);

    mc = new MediaController(this);

    vw = (VideoView) findViewById(R.id.videoView);

    vw.setVideoPath("http://173.45.164.105:1935/live/myStream/playlist.m3u8");

    vw.setOnErrorListener(new MediaPlayer.OnErrorListener() {
        @Override
        public boolean onError(MediaPlayer arg0, int arg1, int arg2) {
            vw.stopPlayback();
            vw.start();
            Log.i("VIDEO ERROR ", "FROZE");
            return true;
        }
    });
    vw.requestFocus();
    vw.start();
}

}

4

1 に答える 1

0

私の理解では、ネイティブの VideoView 要素は、ビデオを開くときにのみ onError() メソッドを呼び出します。

参照: VideoView ソース

VideoView パス/URI を設定するときに呼び出される openVideo() メソッドでは、いくつかの例外が MediaPlayer.MEDIA_ERROR_UNKNOWN エラーをスローすることによって処理されます。

ビデオソースとの接続が失われるたびに、MediaPlayer のバックグラウンドで何が起こっているかはわかりませんが、接続が再確立されるのを無期限に待機しているようです。onErrorListener を介してエラーをスローすることはありません。

ただし、setVideoPath() または setVideoUri() メソッドを再度呼び出すと、onError() メソッド呼び出され、openVideo() で例外がスローされます。

接続が失われたことを検出する方法を見つけるか、ビデオの時間が更新されているかどうかを確認して手動でエラーをスローする必要があります。

誰かがこれを修正するより良い方法を見つけたら、私に知らせてください。

于 2016-06-14T16:54:53.830 に答える