можно ли перезапустить медиаплеер при воссоздании поверхности?(Android) - PullRequest
2 голосов
/ 17 ноября 2010

У меня есть действие (скажем, упражнение A), которое отображает видео с помощью медиаплеера, отображаемого в виде поверхности.
Вариант использования: приостановить видео, запустить другое действие (скажем, действие B), а затем вернуться к занятию A.
Деятельность A останавливается, но не уничтожается при переходе к B, что хорошо.
Поверхностный вид (поскольку он не виден) уничтожается (как видно из обратных вызовов уведомлений).
Когда вы возвращаетесь к заданию A и перезапускаете медиаплеер с помощью start (), медиаплеер воспроизводит звук, но видео не видно. Подобные ошибки выводятся на Logcat:

11-16 18:14:44.532: ERROR/Overlay(8630): Error = Invalid argument from qbuf

К сожалению, использование нового экземпляра SurfaceHolder, предоставленного surfaceCreated(), не помогает (т.е. выдает ту же ошибку).

Я читал в различных постах, решение было бы сбросить mediaplayer и перезапустить его полностью, однако это неэффективно, так как конечный пользователь должен будет ждать подготовки всего игрока cycle + seekTo last positio n внутри потока .

Как видно из того факта, что звук воспроизводится, между видеодекодером и новым surfaceholder/view должен стоять вопрос.

Каким должно быть лучшее решение (лучшее = самое быстрое) для возобновления воспроизведения видео при возобновлении активности?

Ответы [ 4 ]

1 голос
/ 31 марта 2012

Под Android 4 это возможно (извините, у меня только 2.3 и 4.0, я не тестирую его в 3.0). Когда вы используете Surface и медиаплеер, вы не можете изменить поверхность для медиаплеера. То же самое для видео.

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

В Android 4.0 вы можете изменить поверхность или держатель поверхности для медиаплеера.

0 голосов
/ 17 ноября 2010

Будьте осторожны, поскольку операция A может быть прервана ОС, если она приостановлена ​​в стеке истории и отображает операцию B. Вы должны написать код, чтобы ожидать ее.

Если скорость важна для вас, вы можете не запускатьсядеятельность B, но вместо этого скрывает видеовидение и вместо него показывает другой вид.

0 голосов
/ 17 ноября 2010

Спасибо. Обработка того факта, что действие может быть уничтожено, потому что системе нужны ресурсы, будет в порядке.

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

Из поведения медиаплеера действительно кажется, что чего-то не хватает, чтобы заставить его работать должным образом, т. Е. Звук вернулся (что подразумевает, что демультиплексирование аудио / видео происходит правильно), я бы предположил, что это всего лишь вопрос слесарного дела. между видеодекодером и рендерером видео.

0 голосов
/ 17 ноября 2010

Можете ли вы попробовать с VideoView, так как он включает в себя и объект Surface, и MediaPlayer

...