2016-02-26 6 views
1

Моя цель - отобразить цветное видеоизображение ExoPlayer как черно-белое.Как «применить фрагментарный шейдер к GLSurfaceView/TextureView»?

Согласно этому this Github issue я должен быть в состоянии добиться этого с Open GL:

ExoPlayer будет оказывать видео на любой поверхности. Вы можете использовать SurfaceTexture, после чего у вас будет видео, обработанное текстурой OpenGL ES . После этого вы можете делать все, что позволяет OpenGL , в том числе использовать пиксельный шейдер для преобразования видео в черно-белый.

В an older, but related, discussion in the Android Developers Google group Romain Guy дает некоторые подробности о том, как это должно быть сделано:

  • Создать контекст OpenGL
  • Генерирование OpenGL имя текстуры
  • Создать SurfaceTexture с текстурой имя
  • Передача поверхности на камеру
  • Слушайте fo г Обновления на обновление SurfaceTexture, нарисовать текстуру с OpenGL с использованием затенения вы хотите

Простой :)

И играя с Google's Cardboard example project я определил, что фрагмент шейдера как следующий один должен быть о праве:

precision mediump float; 
varying vec4 v_Color; 

void main() { 
    float grayscale = v_Color[0] * 0.3 + v_Color[1] * 0.59 + v_Color[2] * 0.11; 
    gl_FragColor = vec4(grayscale, grayscale, grayscale, 0.1); 
} 

Я также сумел иметь ExoPlayer визуализации в TextureView вместо обычного SurfaceView:

mPlayer.sendMessage(
    videoRenderer, 
    MediaCodecVideoTrackRenderer.MSG_SET_SURFACE, 
    new Surface(mVideoTextureView.getSurfaceTexture()) 
); 

Теперь, как мне соединить все вместе?

Где я могу «применить» шейдер к TextureView? Возможно ли это, или я должен использовать вместо этого GLSurfaceView? Что мне нужно сделать в Renderer?

+1

Вы видели это: https://github.com/google/ExoPlayer/issues/1220 и ссылку в нем? –

+0

Спасибо, связанное сообщение в блоге действительно обеспечило рабочее решение! Большое спасибо! –

+0

Эй, Дэвид, я тоже пытаюсь сделать то же самое, но я застрял на этом последние 2 дня.Я взглянул на код VideoSurfaceView VidEffect, но когда я интегрирую exoplayer, видео становится черным, но со звуком. Если у вас все еще есть рабочее решение, это будет означать много, если вы можете поделиться этим. –

ответ

1

Я применил фрагментарные шейдеры к видео, которое раньше воспроизводил ExoPlayer. Наиболее эффективным способом является воспроизведение видео на GLSurfaceView, так как они имеют хорошую поддержку для пользовательских рендерингов.

Рабочий пример применения шейдеров OpenGL на GLSurfaceView можно получить у here. Он даже имеет шейдер фрагмента оттенков серого уже как часть его effects library. Существующий код потребует некоторого небольшого рефакторинга, поскольку он использует MediaPlayer, а не ExoPlayer.

+0

Спасибо! Я построил свое решение из сообщения в блоге, которое комментировал комментарий @Morrison Chang - он использует «TextureView» и передает «Surface» в ExoPlayer. Но, возможно, мне по-прежнему придется переключиться на «GLSurfaceView», потому что мне также нужно будет поддерживать VisualOn, и этот игрок принимает только «SurfaceView» (а не «поверхность» напрямую). –

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