【问题标题】:Audio lags or stutters playing Youtube videos in a floating WebView based on Chromium在基于 Chromium 的浮动 WebView 中播放 Youtube 视频时音频滞后或卡顿
【发布时间】:2016-04-26 07:57:28
【问题描述】:

我正在开发一个带有浮动 WebView 的 Android 应用程序,该应用程序使用 Youtube 的 IFrame API 播放 Youtube 视频。浮动视图是作为服务实现的,当用户浏览应用程序的不同活动时它始终处于打开状态,当应用程序最小化时它也会浮动。

现在的问题是,当视图组件在活动中呈现时,视频的声音会滞后或卡顿。这是我所做的故障排除:

  • 我做了两个简单的活动,背后没有网络工作,只是布局中的一堆按钮。当您导航到这些活动或返回时,声音会中断一秒钟或更长时间。

  • 我已经在我的应用程序和 WebView 上设置了硬件加速属性。这些是我用来将 WebView 添加到 WindowManager 的参数

    int flags = WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED | WindowManager.LayoutParams.FLAG_FULLSCREEN |
            WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL |
            WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
    
    WindowManager.LayoutParams params = new WindowManager.LayoutParams(
            LayoutParams.WRAP_CONTENT,
            LayoutParams.WRAP_CONTENT,
            WindowManager.LayoutParams.TYPE_PHONE,
            flags,
            PixelFormat.TRANSLUCENT);
    
  • 我已将 webView 的 setLayerType 设置为 LAYER_TYPE_HARDWARE。以下是 WebView 的设置代码

    WebSettings settings = webView.getSettings();
    settings.setJavaScriptEnabled(true);
    settings.setDomStorageEnabled(true);
    settings.setDatabaseEnabled(true);
    settings.setCacheMode(WebSettings.LOAD_NO_CACHE);
    
    AndroidInterface javascriptInterface = new AndroidInterface(this);
    webView.addJavascriptInterface(javascriptInterface,         "AndroidFunction");
    webView.setWebChromeClient(new WebChromeClient());
    webView.setWebViewClient(new WebViewClient());
    webView.getSettings().setLoadWithOverviewMode(true);
    webView.getSettings().setUseWideViewPort(true);
    webView.setVerticalScrollBarEnabled(false);
    webView.setHorizontalScrollBarEnabled(false);
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
        webView.setLayerType(View.LAYER_TYPE_HARDWARE, null);
    } else {
        webView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
    }
    
  • 我也试过关闭应用程序的硬件加速,但 WebView 需要它来播放视频。

  • 我已经加载了一个 Youtube 视频,但没有使用他们的 IFrame API,我也遇到了同样的问题。

  • 这很有趣,如果我加载 Vimeo 视频,则不会出现此问题。

  • 此问题出现在 Nexus 5(Android 版本 6.0.1)中,但不会出现在三星 Galaxy S3 mini(Android 版本 4.2.2)中。这让我觉得这个问题与 Chromium 有关,因为 WebView 在所有 4.4 之前的设备上使用 WebKit,并且不使用 Chromium。

以前有人遇到过这个问题吗?任何想法都会很有用!

提前致谢。

【问题讨论】:

    标签: android webview youtube chromium


    【解决方案1】:

    最后我找到了解决这个问题的方法。我在另一个进程中声明了该服务(在 Android Manifest 文件中指定了 android:process 属性)。两个服务之间的通信必须使用 IPC(Android 进程间通信)和 Messenger 来完成。

    【讨论】:

      猜你喜欢
      • 2011-05-29
      • 2018-05-22
      • 2011-01-18
      • 1970-01-01
      • 2020-11-21
      • 1970-01-01
      • 2013-11-19
      • 2012-12-14
      • 2012-06-07
      相关资源
      最近更新 更多