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设备上工作)