переключение просмотров видео

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

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

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

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

Спасибо!


person Karthik    schedule 24.10.2011    source источник


Ответы (3)


Копаясь в исходном коде для 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() происходит все волшебство.

person goto10    schedule 24.10.2011
comment
Вы можете попробовать сделать так, чтобы оба VideoView были видимы, и использовать BringToFront(), чтобы изменить, какой из них находится сверху, но я сомневаюсь, что это сработает. - person goto10; 24.10.2011

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

Видимо да. openVideo() требует, чтобы есть некоторая видимость

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

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

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

person Reno    schedule 24.10.2011
comment
Я должен использовать свой собственный просмотр видео, я думаю. Спасибо. - person Karthik; 28.10.2011

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

person Konstantin Pribluda    schedule 24.10.2011