2013-01-29 3 views
23

Мне нужно, чтобы можно было поворачивать видео на экране, поэтому я создал пользовательский TextureView, который обеспечивает комфортный уровень над MediaPlayer, похожий на то, как выполняется текущая реализация VideoView. This Android blog post говорит следующее о TextureView:Android TextureView vs VideoView Performance

Поскольку содержание А SurfaceView в не живет в окне приложения, оно не может быть преобразован (перемещать, масштабировать, вращать) эффективно. Это затрудняет использование SurfaceView внутри ListView или ScrollView. SurfaceView также не может корректно взаимодействовать с некоторыми функциями инструментария пользовательского интерфейса, например, затухающими краями или View.setAlpha().

Для решения этих проблем в Android 4.0 представлен новый виджет TextureView, основанный на аппаратном ускоренном 2D-конвейере рендеринга и SurfaceTexture. TextureView предлагает те же возможности, что и SurfaceView, но, в отличие от SurfaceView, ведет себя как обычный вид. Например, вы можете использовать TextureView для отображения сцены OpenGL или видеопотока. Сам TextureView может быть анимированным, прокрученным и т. Д.

Однако, похоже, что TextureView пытается воспроизвести видео. На целевом устройстве, на котором я тестирую его, есть двухъядерный процессор Rockchip RK3066 с тактовой частотой 1,2 ГГц, четырехъядерный графический процессор Mali-400 (ARM) и 1 ГБ оперативной памяти. Тот же код с помощью VideoViews на этом устройстве отлично работает, но TextureViews либо «заикаются» во время воспроизведения, либо вообще не отображаются (черный ящик с белыми квадратами в левом верхнем углу), в зависимости от конкретного устройства. TextureViews отлично работают на эмуляторе с помощью устройства x86, поставляемого Intel.

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

+0

Я мало знаю о вашей конкретной установке. Увидеть ваш sml и некоторые связанные с ним java могли бы помочь. Имеются ли весы для просмотра текстуры? Какие предупреждения возникают в редакторе пользовательского интерфейса? Они могут помочь вам. –

+0

У вас есть возможность решить проблему или просто лучше избегать использования текстуры с помощью медиаплеера? –

+0

мы не использовали 'TextureView' –

ответ

18

Да, ожидается TextureView. TextureView заставляет видео проходить обычное представление-компоновку для рендеринга, в отличие от SurfaceView, которое напрямую компонуется в графическом процессоре (конвейер декодирования передает непосредственно в область экрана, где вы размещаете SurfaceView). В то время как рендеринг TextureView аппаратно-ускоренный, он все еще выполняет больше шагов для дополнительной гибкости, и есть определенный успех. Кроме того, любой код, выполняющийся на UI-потоке, может влиять на TextureView в отличие от SurfaceView.

Дополнительная информация:

1

Вы можете увидеть это article

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

Основной удар против TextureView - это выполнение этапа композиции. С SurfaceView содержимое записывается на отдельный слой, который SurfaceFlinger объединяет, в идеале с наложением. С TextureView композиция View всегда выполняется с помощью GLES, а обновления к ее содержимому могут также вызвать перерисовку других элементов View (например, если они расположены поверх TextureView).После завершения рендеринга представления слой пользовательского интерфейса приложения затем должен быть скомпонован с другими слоями SurfaceFlinger, поэтому вы эффективно составляете каждый видимый пиксель дважды. Для полноэкранного видеопроигрывателя или любого другого приложения, которое фактически представляет собой только элементы пользовательского интерфейса, расположенные поверх видео, SurfaceView предлагает гораздо лучшую производительность.