UIWebView本地video/audio播放iOS不工作,使用meteor(PhoneGap)

我使用meteor来构build一个非常简单的应用程序(理论上)。 基本上是一个播放button,应该开始一个video。

这听起来很简单,但在iOS UIWebView中如何处理<video><audio>标签似乎有些根本性的错误。

我的理解是Meteor使用本地服务器,因此您可以从Meteor应用程序的/public -folder中加载资源文件。

这符合图像的预期: <img src="/images/image.png">

但是,对video和audio标签执行相同的操作也会引发意外的错误。

远程加载文件也可以正常工作,但是当video/audio成为本地文件系统的一部分时,UIWebView似乎会变得混乱到如何处理它。

我已经用Cordova的File和FileTransfer插件进行了试验,以获取,移动,获取nativeURLs,并重新组织这些文件,使其具有任何意义,但是<video><audio>元素仍然会抛出错误。

我甚至尝试将audio文件转换为base64string,并将其直接embedded到标记中。 这也不pipe用。

最后,我尝试了简单的XHR,将文件作为一个blob检索,然后制作一个URL:

 var xhr = new XMLHttpRequest(); xhr.open("get", "/videos/example.mp4"); xhr.responseType = "blob"; xhr.addEventListener("load", function() { var blob = this.response; var url = window.URL.createObjectURL(blob); $("video")[0].src = url; }); 

仍然没有运气。 请注意,我试过的一切工作的图像文件,但不是audio/video。

很难说出问题的起因,UIWebView如何处理请求的video/audio文件,或者Meteor的小型networking服务器设置中的问题,它用于打包的PhoneGap iOS应用程序。

无论如何,是否有解决方法?

经过进一步的调查,我得出的结论是,这个问题是由Meteor构build的内部Web服务器返回的MIMEtypes。

networking服务器似乎缺乏audio和video文件的媒体MIMEtypes。

我通过将文件作为一个arraybuffer ,然后重build一个Blob ,设置{type: "video/quicktime"} (.mov文件)来解决这个问题。

 function getBlobURL(url, mime, callback) { var xhr = new XMLHttpRequest(); xhr.open("get", url); xhr.responseType = "arraybuffer"; xhr.addEventListener("load", function() { var arrayBufferView = new Uint8Array( this.response ); var blob = new Blob( [ arrayBufferView ], { type: mime } ); var url = window.URL.createObjectURL(blob); callback(url, blob); }); xhr.send(); } getBlobURL("/videos/example.mov", "video/quicktime", function(url, blob) { $("video")[0].src = url; }); 

同样的方法适用于audio文件, audio/mpeg为.mp3。

(注意:这个修补程序在<iOS 8.0上不起作用,但我没有做任何进一步的调查,因为我只需要它在一个封闭的环境中的托pipe设备上工作)