在UIWebView中从AVPlayer获取视频URL

11

我正在尝试使用以下方法从UIWebView中检测当前正在播放的视频的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!)

    }

这段代码可以运行,但视频的URL不包含任何视频文件扩展名,例如YouTube和Vimeo视频的URL:

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 

请您不要再给问题添加无关的标签了。您的问题既不是关于实体iPhone,也不是关于Xcode IDE的。在使用标签之前,请仔细阅读其描述。谢谢。 - rmaddy
".m3u8" 在 Vimeo 上是一个知名的视频“格式”。您可以查找它。对于其余部分,它是否至少拥有一些“<video...>”标签或播放器呢? - Larme
由于UIWebView从流中播放视频,所以没有文件扩展名;因此,您无法直接下载它。 - ninjaproger
@Larme m3u8 不是一个视频文件格式,它是一个播放列表文件。 - ninjaproger
@Larme,看,我只需要一种从像YouTube等网站下载电影的方法...在应用商店中有一些下载器,当您点击要观看的视频时,自动弹出警报,您可以下载视频文件。 - iOS.Lover
显示剩余4条评论
2个回答

0

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

镜像服务器

这是因为在上传、下载和流媒体过程中,谷歌使用了一个名为googlevideo.com的镜像服务器。

当您处于流媒体状态时访问视频链接,您将只得到该镜像链接。Youtube视频存放在此镜像服务器内。

同样,Vimeo也使用了镜像服务器akamaized.net

请参考SO POST以获得澄清。

从镜像URL解码视频链接

因此,在这种情况下,我们需要拥有YouTube视频的唯一ID,可以通过附加URLhttps://www.youtube.com/watch?v=id_here来访问。

根据SO Answer,从这个镜像URL解码唯一ID是不可能的。

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

根据YouTube服务条款第5B节 -- http://www.youtube.com/static?template=terms,下载YouTube内容不符合服务条款。
有一些像PSYouTubeExtractor这样的私人API。
我认为您需要拥有视频的URL以便进行下载。

忘掉YouTube吧,那只是一个答案,你可以下载这个应用程序:https://itunes.apple.com/us/app/browser-and-file-manager-for-documents/id979401801?mt=8 它可以从任何网站下载任何类型的视频! - iOS.Lover
Alamofire会为您完成这个任务,以便下载任何文件。 - Saranjith

0

您可以通过以下方式获取MIME类型和原始数据:

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)
    }

然后您可以选择与MIME类型相匹配的适当扩展名。通过调用AVURLAsset.audiovisualMIMETypes(),您可以获取所有支持的类型。


我们能获取视频名称吗? - vp2698

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接