Android – 在SurfaceTexture上绘制YouTube视频

前端之家收集整理的这篇文章主要介绍了Android – 在SurfaceTexture上绘制YouTube视频前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试在SurfaceTexture上绘制WebView,以便我可以在OpenGL中渲染它.

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

  1. ...
  2. webView.getSettings().setJavaScriptEnabled(true);
  3.  
  4. if (Build.VERSION.SDK_INT < 8)
  5. {
  6. webView.getSettings().setPluginsEnabled(true);
  7. }
  8. else
  9. {
  10. webView.getSettings().setPluginState(WebSettings.PluginState.ON);
  11. }
  12. webView.setWebChromeClient(new WebChromeClient() { });
  13. webView.setWebViewClient(new WebViewClient());
  14. ...

还打开了硬件加速:

  1. <application
  2. android:hardwareAccelerated="true"
  3. ...

我还基于本教程成功渲染了OpenGL中的WebView(播放视频除外):http://anuraagsridhar.wordpress.com/2013/03/13/rendering-an-android-webview-or-for-that-matter-any-android-view-directly-to-opengl/

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

  1. Point p = new Point();
  2. activity.getWindow().getWindowManager().getDefaultDisplay().getSize(p);
  3. webView.setLayoutParams(new ViewGroup.LayoutParams(p.x,p.y));
  4. surfaceTexture.setDefaultBufferSize(p.x,p.y);

覆盖WebView的onDraw方法

  1. @Override
  2. public void onDraw(Canvas c)
  3. {
  4. try
  5. {
  6. Point p = new Point();
  7. activity.getWindow().getWindowManager().getDefaultDisplay().getSize(p);
  8. Canvas canvas = surfaceTexture.lockCanvas(new Rect(0,p.x,p.y));
  9. canvas.save();
  10. canvas.translate(-scrollL,-scrollT);
  11. super.onDraw(canvas);
  12. canvas.restore();
  13. surfaceTexture.unlockCanvasAndPost(canvas);
  14. }
  15. catch (Surface.OutOfResourcesException e)
  16. {
  17. throw new RuntimeException(e);
  18. }
  19. }

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

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

解决方法

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

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

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

猜你在找的Android相关文章