2016-02-26 33 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羅曼蓋伊給出了一些細節,如何這要做到:

  • 創建OpenGL上下文
  • 生成一個OpenGL紋理名
  • 與紋理創建表面紋理命名
  • 傳遞表面紋理到相機
  • 聽FO [R更新在表面紋理更新,使用着色器繪製 的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天這一點。我看了VidEffect的VideoSurfaceView代碼,但是當我整合了exoplayer時,視頻呈現黑色,但是有音頻。如果你仍然有工作解決方案,如果你可以分享這個解決方案,這意味着很多。 –

回答

1

我已經申請片段着色到視頻正由ExoPlayer之前播放。最有效的方法似乎是將視頻播放到GLSurfaceView上,因爲它們對自定義渲染器有很好的支持。

施加的OpenGL着色器到GLSurfaceView的一個工作的例子是可得自here。它甚至已經有一個灰度片段着色器作爲其effects library的一部分。現有的代碼將需要一些小的重構,因爲它使用MediaPlayer而不是ExoPlayer

+0

謝謝!我從@Morrison Chang的評論引導我的博客文章構建了我的解決方案 - 它使用了一個'TextureView'並將'Surface'傳遞給了ExoPlayer。但是也許我仍然會切換到'GLSurfaceView',因爲我還需要支持VisualOn,並且該播放器只接受一個'SurfaceView'(而不是直接''Surface')。 –

相關問題