переключение видеообзоров

#android #android-videoview

#Android #android-видеообзор

Вопрос:

В моей деятельности у меня есть 2 видеообзора. я должен непрерывно воспроизводить разные видеофайлы один за другим.
Чтобы сократить время переключения, я планировал перевернуть просмотры видео. т. Е. Один просмотр видео будет VISIBLE , а другой есть GONE . Во время воспроизведения видимого видеообзора я могу инициализировать ( setVideoPath ) другой видеообзор.

Но, основываясь на журналах, я обнаружил, что для видеообзора с видимостью GONE после вызова setVideoPath OnPreparedListener вызывается только тогда, когда представление становится VISIBLE . Т.е. после завершения первого видеообзора я переключаю видимость, затем я получаю OnPreparedListener для 2-го видеообзора.

Чтобы подтвердить свои выводы, я сделал оба видеообзора VISIBLE и позвонил setVideoPath . В этом случае оба OnPreparedListener вызываются немедленно.

Вопрос:
Зависит ли подготовка видеообзора ( setVideoPath ) от его видимости?
Есть ли какой-либо способ подготовить видеообзор в фоновом режиме (не показывая его пользователю)?

Спасибо!

Ответ №1:

Зависит ли подготовка видеообзора (setVideoPath) от его видимости?

По-видимому, да. openVideo() требует наличия некоторой видимости

 public void setVideoURI(Uri uri) {
        mUri = uri;
        mStartWhenPrepared = false;
        mSeekWhenPrepared = 0;
        openVideo();
        requestLayout();
        invalidate();
    }
  

Есть ли какой-либо способ подготовить видеообзор в фоновом режиме (не показывая его пользователю)?

Расширьте это VideoView и подготовьтесь самостоятельно. Или просто используйте свой собственный VideoView

Комментарии:

1. Я должен использовать свой собственный вид видео, я думаю. Спасибо.

Ответ №2:

Копание в исходном коде для VideoView и SurfaceView похоже, что большая часть работы по инициализации медиаплеера не выполняется до тех пор, пока вид не станет видимым. Я не вижу способа обойти это.

В частности, вот часть SurfaceView.java это выполняется, когда представление становится видимым:

 if (visible) {
    // other stuff
    if (visibleChanged) {
        mIsCreating = true;
        for (SurfaceHolder.Callback c : callbacks) {
            c.surfaceCreated(mSurfaceHolder);
        }
    }
    // other stuff
}
  

Это вызывает это в VideoView.java:

 SurfaceHolder.Callback mSHCallback = new SurfaceHolder.Callback()
{
    // other stuff
    public void surfaceCreated(SurfaceHolder holder)
    {
        mSurfaceHolder = holder;
        openVideo();
    }
    // other stuff
}
  

И openVideo () — это то, где происходит все волшебство.

Комментарии:

1. Вы могли бы попробовать сделать видимыми оба видеообзора и использовать BringToFront(), чтобы изменить, какой из них находится сверху, но я сомневаюсь, что это сработает.

Ответ №3:

Вид должен быть видимым и выложенным, прежде чем его можно будет привязать к приложению камеры. (Перед тем, как вы что-либо сделаете, должны быть обработаны откаты просмотра поверхности).