在UIWebView中从AVPlayer获取videoURL

我试图检测从UIWebView播放的当前video的URL,使用此方法:

func webView(_ webView: UIWebView, shouldStartLoadWith request: URLRequest, navigationType: UIWebViewNavigationType) -> Bool { NotificationCenter.default.addObserver(self, selector: #selector(playerItemBecameCurrent(notification:)), name: NSNotification.Name("AVPlayerItemBecameCurrentNotification"), object: nil) //urlTextField.text = webView.request?.url?.absoluteString return true } func playerItemBecameCurrent(notification:Notification) { let playerItem: AVPlayerItem? = notification.object as? AVPlayerItem if playerItem == nil { return } // Break down the AVPlayerItem to get to the path let asset: AVURLAsset? = (playerItem?.asset as? AVURLAsset) let url: URL? = asset?.url let path: String? = url?.absoluteString print(path!) } 

此代码有效,但videourl不包含任何video文件扩展名:例如,这里是YouTube和VimeovideoULR:

 https://r5---sn-ab5l6nzr.googlevideo.com/videoplayback?mime=video%2Fmp4&requiressl=yes&clen=27257208&mn=sn-ab5l6nzr&mm=31&mv=m&mt=1499534990&key=yt6&ms=au&source=youtube&ip=107.182.226.163&sparams=clen%2Cdur%2Cei%2Cgir%2Cid%2Cinitcwndbps%2Cip%2Cipbits%2Citag%2Clmt%2Cmime%2Cmm%2Cmn%2Cms%2Cmv%2Cpl%2Cratebypass%2Crequiressl%2Csource%2Cexpire&initcwndbps=3565000&id=o-ACG22m-TtwyC8tSG_AHUJk3qOPvhUm1X_-qRjy07pjIx&ei=-hZhWZXcJ_aV8gS2tbCQDg&lmt=1497638262979584&ratebypass=yes&gir=yes&pl=25&expire=1499556698&dur=316.093&signature=94C8ED3E4AF64A7AC9F1B7E226454823B236CA55.C18F5F5D9D314B73EDD01DFC4EA3CEA1621AC6C7&ipbits=0&itag=18&cpn=Wb3RPNfJRcFx5P-x&c=MWEB&cver=1.20170706&ptk=TiTV2010%2Buser&oid=1nI2Jk44kRu4HLE6kGDUrA&ptchn=E2VhHmwp3Y_wZvgz_LJvfg&pltype=content 

和Vimeo:

 https://36skyfiregce-vimeo.akamaized.net/exp=1499539063~acl=%2F222646835%2F%2A~hmac=dc3caeb64501f537e2795ee8e121aed75a7eed9ba4e1b921fe92c757fe06b314/222646835/video/778109097,778109103,778109102,778109101/master.m3u8?f=dash 

首先,我想告诉你,你编码工作正常。

镜像服务器

这是因为在上传,下载和stream媒体过程中,谷歌正在使用域名为googlevideo.com的镜像服务器。

您在stream媒体状态下访问链接video。 你只会得到这个镜像链接。 Youtube videos驻留在这个镜像服务器内。

就像Vimeo使用镜像服务器akamaized.net

请参阅SO POST澄清

从镜像URL解码video链接

所以在这种情况下,我们需要的是在YouTube上唯一的videoID,同样可以通过追加URL来访问https://www.youtube.com/watch?v=id_here

对于从这个镜像URL解码唯一的ID是不可能的,因为通过回答

他们添加了这个镜像服务器的概念,是为了有一定的安全性。

按照YouTube条款和细则。第5B节在这里 – http://www.youtube.com/static?template=terms

下载YouTube内容不符合YouTube Tearms of Service。

有一些私人的API,如PSYouTubeExtractor 。

我想你需要有下载video的url。

你可以得到这样的MIMEtypes和原始数据:

 func playerItemBecameCurrent(notification:Notification) { guard let playerItem = notification.object as? AVPlayerItem, let asset = playerItem.asset as? AVURLAsset else {return} let url = asset.url var response: URLResponse? = nil var request = URLRequest(url: url) request.httpMethod = "HEAD" try? NSURLConnection.sendSynchronousRequest(request, returning: &response) print(response?.mimeType) //not the best way to do it //let data = try? Data(contentsOf: asset.url) } 

然后你可以select适合MIMEtypes的扩展。 您可以通过调用AVURLAsset.audiovisualMIMETypes()来获得所有支持的types