flutter_inappwebview - 没有 html- 视频

flutter_inappwebview - no html-video

我在 Flutter 应用程序中使用 flutter_inappwebview 来显示本地 html(来自资产)。 (我知道:不理想。我更愿意用 Dart 编写整个程序,但现在这不是一个选项)。它工作得很好……除了一件事。无法播放 html 中的视频。

问题
当我在任何浏览器(直接从资产文件夹)中打开 html 时,视频工作正常。所以 html 应该没问题。所有其他 html 在应用程序中工作正常。所以 files 和 pubspec-import 应该没问题。在应用程序中,页面显示视频播放器,但 iOS-sim 和 iOS 设备上都没有内容。在 Android-sim 中它可以工作。

代码
我正在使用:
flutter_inappwebview: ^3.2.0
SDK: ">=2.7.0 <3.0.0"

导入后,我这样使用 inappview。服务器已经 运行(flutter 报告:flutter: Server 运行 on http://localhost:8080

InAppWebViewController webViewController;
InAppWebView webView;

class OfflineViewer extends StatefulWidget {
  @override
  _ViewerState createState() => _ViewerState();
}

class _ViewerState extends State<OfflineViewer> {
  @override
  Widget build(BuildContext context) {
    return InAppWebView(
      initialUrl: "http://localhost:8080/assets/source/intro.html",
      onWebViewCreated: (InAppWebViewController controller) {
        webViewController = controller;
      },
    );
  }
}

加载的 intro.html 中的视频标签是:

  <video height="600" controls>
    <source src="intro.mp4" type="video/mp4">  
  Your browser does not support the video tag.
  </video>

我试过的东西:
不同的视频格式(webm、ogg)> 没有区别。
将在线视频加载到 html 而不是本地 > 工作。视频加载和播放。
嵌入视频的不同方法(视频标签、iframe、video.js)> 没有区别。
设置 InAppWebViewOptions,如:

cacheEnabled: true,
javaScriptCanOpenWindowsAutomatically: true,
useOnLoadResource: true,
javaScriptEnabled: true,
mediaPlaybackRequiresUserGesture: false,

让这个问题(对我而言)难以解决的是,一旦它嵌入到应用程序中,我就无法捕捉到 html 错误,而独立的 html 不会给出错误。非常感谢任何关于如何解决甚至排除故障的想法。

你好,
马克

不确定,但您的 Info.plist 中可能缺少 NSAppTransportSecurity 设置。这允许您加载 http://localhost:8080 属于的不安全内容。

    <key>NSAppTransportSecurity</key>
    <dict>
        <key>NSAllowsArbitraryLoads</key>
        <true/>
    </dict>

整理好了。只是张贴这个以防其他人有同样的问题。问题的原因是:HTTPServer-class 创建了一个 blob-server。它 returns 一个视频块(状态 200)。 iOS 不接受并想要状态 206(零件)。

基于,我创建了一个 JS 文件,用于转换文档中的所有视频。只需将其添加到任何 html 视频文件中即可:

if(navigator.platform && /iPad|iPhone|iPod|Mac/.test(navigator.platform)){
    window.addEventListener("load", streamVideoBlobs);
 }

function streamVideoBlobs(){
    var allVideos = document.getElementsByTagName("video");
    for(var i = 0, max = allVideos.length; i < max; i++) 
    {
        iOSVideoConvert(allVideos[i]);       
    }
}

async function iOSVideoConvert(video){
    let blob = await fetch(video.src).then(r => r.blob());
    var videoUrl=createObjectURL(blob);
    video.src = videoUrl;
}

function createObjectURL(object) {
    return (window.URL) ? window.URL.createObjectURL(object) : window.webkitURL.createObjectURL(object);
}

除此之外,您还必须设置

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsLocalNetworking</key>
    <true/>
</dict>

在你的 info.plist 中。 (您也可以使用 NSAllowsArbitraryLoads,但这需要更多的余地,Apple 可能会在提交应用程序时将其标记下来)。

这让我意识到,问题不是 WebView,而是 LocalServer 端。

当出现视频标签时,我更改了 localServer 逻辑以提供基本 64 位编码的视频源,它对我有效