gpt4 book ai didi

Android - 在 SurfaceTexture 上绘制 YouTube 视频

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:37:25 27 4
gpt4 key购买 nike

我正在尝试在 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());
...

同时开启硬件加速:

 <application
android:hardwareAccelerated="true"
...

而且我还根据本教程在 OpenGL 中成功渲染了 WebView(播放视频除外):http://anuraagsridhar.wordpress.com/2013/03/13/rendering-an-android-webview-or-for-that-matter-any-android-view-directly-to-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);

重写 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);
}
}

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

所以问题是:有什么方法可以在 OpenGL 纹理上播放 youtube 视频吗?

最佳答案

问题是这样的:视频被绘制到一个单独的窗口,该窗口位于 View 层次结构的窗口后面,并且不容易访问以绘制在您的 SurfaceTexture 上。使事情复杂化的是,WebView 将定位视频窗口并调整其大小,而不考虑将其自身绘制到屏幕上显示的 Canvas 上。此外,视频以 native 代码呈现,您将无法以足够快的速度绘制到 Canvas 以跟上(这就是为视频提供单独窗口的全部想法)。

任何令人满意的解决方案几乎都需要使用私有(private) API 以 native 代码访问视频窗口。根据您计划如何使用您的 SurfaceTexture,您可能想出一个解决方法,涉及拦截 WebViewClient 中的 URL,在呈现之前去除任何视频标签,并将在您控制下的 SurfaceViewTextureView 中播放视频。然后,您可以将它放在与您绘制 SurfaceTexture 的位置相关的位置,但这会将您对 SurfaceTexture 的使用限制在广告牌上。不过,这种黑客攻击很快就会变得非常丑陋。

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

关于Android - 在 SurfaceTexture 上绘制 YouTube 视频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19273437/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com