Android - 在SurfaceTexture上绘制YouTube视频

Pio*_*pil 10 youtube video android opengl-es webview

我正在尝试在SurfaceTexture上绘制WebView,以便我可以在OpenGL中渲染它.

到目前为止,我成功地在WebView中以标准方式播放了youtube视频:

  ...
  webView.getSettings().setJavaScriptEnabled(true);

  if (Build.VERSION.SDK_INT < 8) 
  {
     webView.getSettings().setPluginsEnabled(true);
  } 
  else 
  {
     webView.getSettings().setPluginState(WebSettings.PluginState.ON);
  }
  webView.setWebChromeClient(new WebChromeClient() { });
  webView.setWebViewClient(new WebViewClient());
  ...
Run Code Online (Sandbox Code Playgroud)

还打开了硬件加速:

 <application
        android:hardwareAccelerated="true"
 ...
Run Code Online (Sandbox Code Playgroud)

我还基于本教程在OpenGL中成功渲染了WebView(除了播放视频):http://anuraagsridhar.wordpress.com/2013/03/13/rendering-an-android-webview-or-for-that-物质-任何-机器人-视图-直接到的OpenGL /

WebView的附加初始化(因此它始终是"纵向"并适合纹理):

 Point p = new Point();
 activity.getWindow().getWindowManager().getDefaultDisplay().getSize(p);
 webView.setLayoutParams(new ViewGroup.LayoutParams(p.x, p.y));
 surfaceTexture.setDefaultBufferSize(p.x, p.y);
Run Code Online (Sandbox Code Playgroud)

Overriden WebView的onDraw方法:

@Override
public void onDraw(Canvas c)
{
   try
   {
      Point p = new Point();
      activity.getWindow().getWindowManager().getDefaultDisplay().getSize(p);
      Canvas canvas = surfaceTexture.lockCanvas(new Rect(0,0,p.x,p.y));
      canvas.save();
      canvas.translate(-scrollL, -scrollT);
      super.onDraw(canvas);
      canvas.restore();
      surfaceTexture.unlockCanvasAndPost(canvas);
   }
   catch (Surface.OutOfResourcesException e)
   {
      throw new RuntimeException(e);
   }
}
Run Code Online (Sandbox Code Playgroud)

当尝试使用上述黑客在webview上播放YouTube视频时,视频矩形为黑色(但可以听到声音).我怀疑硬件加速对表面纹理不起作用.

所以问题是:有没有办法在OpenGL纹理上播放YouTube视频?

Dav*_*ave 7

问题是:视频被绘制到视图层次结构窗口后面的单独窗口,并且不容易在您的窗口上绘制SurfaceTexture.为了使问题复杂化,WebView意志已经定位并调整了视频窗口的大小,而不考虑将其自身绘制到Canvas将在屏幕上显示的窗口之外的其他窗口.此外,视频使用本机代码进行渲染,无论如何都无法以Canvas足够快的速度进行渲染(这就是为视频提供单独窗口的全部理念).

任何令人满意的解决方案几乎都需要使用私有API来访问本机代码中的视频窗口.根据您计划使用的方式SurfaceTexture,您可能会想出一种解决方法,包括拦截a中的URL,WebViewClient在渲染之前删除任何视频标记,以及将视频置于SurfaceViewTextureView控制之下.然后,您可以将它放在与您绘制的位置相关的位置SurfaceTexture,但这限制了您SurfaceTexture对广告牌的使用.不过,那种黑客攻击很快就会变得非常丑陋.

简而言之,我没有看到干净的方法来做到这一点.这是一个不错的主意,但它不适用于公共API.

  • 看来这是可行的.我找到了一款名为[FullDive]的Android应用(https://play.google.com/store/apps/details?id=in.fulldive.shell).它基于Cardboard并成功将Youtube视频渲染到opengl纹理上. (2认同)
  • 与VRTube相同.知道他们是怎么做的吗? (2认同)