2015-02-25 7 views
3

Я работаю над видео-приложением, где пользователь может смотреть видео, открывать его в полноэкранном режиме, если необходимо, и вернуться к стандартным представлениям и так далее. Я использовал ExoPlayer и недавно переключился на MediaPlayer по умолчанию из-за предстоящего объяснения.Перемещение SurfaceView через действия

Мне нужно изменить «на лету» поверхность плеера. Мне нужно использовать один и тот же плеер для отображения видео среди действий, без задержки для отображения изображения. Используя Exoplayer, декодер ждет следующего ключевого кадра для рисования пикселей на пустой поверхности.

Так что мне нужно использовать ту же поверхность, поэтому мне не нужно каждый раз нажимать новую поверхность, просто привяжите поверхность к родительскому элементу View. Поверхность может оставаться неизменной, но если я отсоединяю SurfaceView, чтобы извлечь ее из другой активности и снова подключить ее, внутренняя поверхность будет уничтожена.

Итак, есть способ сохранить одну и ту же поверхность в разных видах деятельности? С услугой?

Я знаю, что вопрос немного странный, я объясню указанную часть запроса в комментарии.

ответ

3

Поверхность, связанная с SurfaceView или TextureView, как правило, будет уничтожена при прекращении действия. Это поведение можно обойти.

Один подход встроен в TextureView и описан в architecture doc и продемонстрирован в операции «double decode» в Grafika. Целью деятельности является продолжение воспроизведения пары видео, в то время как активность перезапускается из-за поворота экрана, а не приостанавливается вообще. Если вы следуете коду, вы можете увидеть, как возвращаемое значение от onSurfaceTextureDestroyed() используется, чтобы сохранить SurfaceTexture в живых, и как TextureView#setSurfaceTexture() присоединяет SurfaceTexture к новому представлению. Есть немного хитрости - setSurfaceTexture() должно произойти в onCreate(), а не onSurfaceTextureAvailable() - но это достаточно просто.

В примере используется выход MediaCodec для воспроизведения видео, но он будет работать одинаково хорошо с любым, что принимает поверхность для вывода - всего create a Surface from the SurfaceTexture.

Если вы не против попадания лодыжки в OpenGL ES, вы можете просто создать свою собственную SurfaceTexture, независимо от видов и видов деятельности, и сделать ее самой текущей SurfaceView. Эффект «текстуры с камеры» от Grafika делает это с живым видео с камеры (хотя он не пытается сохранить его через перезагрузки Activity).

+0

Как TextureView прибыл в API14, я попробую его посмотреть, работает ли он, но мне нужно поддержать minSDK 10. Спасибо за ваш ответ, свяжусь с вами, если это будет работать. –

+0

После некоторой работы я, наконец, закончил свой Extented ExoPlayer, который работает с формой API> = JellyBean и TextureView. У меня все еще какой-то crach (например, <10% при обработке поверхности). В основном я думаю о плохом управлении поверхностью. Посмотрите здесь игрока https://gist.github.com/HugoGresse/669284a16ea25124228b –

Смежные вопросы