VideoView зацикливание видео Пополнить - PullRequest
5 голосов
/ 10 августа 2011

У меня есть приложение с VideoView, которое будет повторять одно и то же видео снова и снова, пока пользователь не сделает что-то с устройством (сенсорный экран и т. Д.). В настоящее время я использую OnCompletionListener () для перезапуска видео после его завершения.Это работает правильно на всех устройствах, которые я тестировал, кроме Samsung Replenish.

Вот мой код:

    mVideoView.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
        public void onCompletion(MediaPlayer mp) {
            mVideoView.setVideoPath(file.getAbsolutePath());
            mVideoView.start();
        }
    });

Что происходит на Replenish, так это то, что видео воспроизводится до конца один разно затем никогда не запускается снова, и экран становится все черным (но подсветка по-прежнему включена).На любом другом устройстве, которое я тестировал с таким же кодом, он работал, чтобы повторить видео.Кто-нибудь знает что-нибудь конкретное о Replenish, которое может вызвать эту ошибку?Я подумал, что, возможно, может помочь отсрочка вызовов setVideoPath () и start () на 200-300 мс, но это никак не отразилось.Я действительно в растерянности.

Я вижу эти сообщения в моем журнале:

ERROR / QCvdec (87): Omx Flush выдается, когда vdec еще не инициализирован.

ERROR / QCvdec (87): OMXCORE-SM: полученная команда DISABLE (2)

ERROR / QCvdec (87): Omx Flush выдается, когда vdec еще не инициализирован.

ERROR / QCvdec (87): OMXCORE-SM: полученная команда ENABLE (3)

Но эти журналы происходят как при запуске видео (при первом воспроизведении), так и при сбое запускаснова.поэтому я не уверен, связаны ли они с моей проблемой

Редактировать:

Я просто попытался установить для mVideoView значение null, а затем получить новую ссылку на него с помощью findViewById () прямо перед setVideoPath().Я знаю, что это усложнит способ настройки OnCompletionListener.Но несмотря на это он все равно не работал, все тот же темный экран.

Редактировать 2:

Я начал замечать, что иногда видео даже не запускается в первый раз,Я использую эти две строчки, чтобы запустить его в первый раз:

        mVideoView.setVideoPath(file.getAbsolutePath());
        mVideoView.start();

Кажется, что он запускается более последовательно, но не совсем на 100%, когда проигрывается в первый раз.

Редактировать 3: Вот как я сейчас это настроил.Я вручную настраиваю OnPreparedListener, чтобы запустить видео для меня.Поэтому я добавил это в свой onCreate ()

        mVideoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {

            @Override
            public void onPrepared(MediaPlayer arg0) {
                 mVideoView.start();
            }
        });

Затем, когда я готов перезапустить видео, я просто вызываю только метод setVideoPath (), например:

mVideoView.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
    public void onCompletion(MediaPlayer mp) {
        mVideoView.setVideoPath(file.getAbsolutePath());

    }
});

Thisкажется, делает трюк.Я позволяю ему какое-то время работать, чтобы выяснить наверняка.

Редактировать 4:

@ MByD В коде для VideoView setVideoPath () является оболочкой для setVideoUri ().setVideoURI () устанавливает mStartWhenPrepared = false; По умолчанию OnPreparedListener проверяет этот переключатель, чтобы решить, следует ли начать воспроизведение или нет.Вот почему он не начинается со слушателя по умолчанию.Я не стал вдаваться в подробности, но может быть метод setter, который позволяет мне изменить значение mStartWhenPrepared на true, что приведет к запуску видео из прослушивателя по умолчанию.

1 Ответ

3 голосов
/ 12 августа 2011

Вы пытались подготовить () свое видео перед вызовом .start ()?

из документов: http://developer.android.com/reference/android/media/MediaPlayer.html#prepare%28%29

с помощью OnPreparedListener , который вы можетеначните видео, когда оно будет готово.

...