#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:
Вид должен быть видимым и выложенным, прежде чем его можно будет привязать к приложению камеры. (Перед тем, как вы что-либо сделаете, должны быть обработаны откаты просмотра поверхности).