Jul*_*n M 6 video download swift
我是 SWIFT/Programming 的新手,我找不到问题的答案,这就是为什么我要在这里试一试:
如何从 URL 下载视频 (mp4) 并将其存储在应用程序中**
我如何在容器中显示视频**
我已经找到了这个话题:
Swift - 使用 downloadTaskWithURL 下载视频
但就我而言,我不希望视频在相机胶卷中受到保护。就在应用程序中。
感谢您的任何帮助/提示!
您可以使用 URLSession 的 dataTask 或 downloadTask 从 url 下载任何文件(如果它是可下载的)
下面是使用dataTask进行下载的方法:
let videoUrl = "Some video url"
let docsUrl = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
let destinationUrl = docsUrl.appendingPathComponent("MyFileSaveName.mp4")
if(FileManager().fileExists(atPath: destinationUrl.path)){
print("\n\nfile already exists\n\n")
}
else{
//DispatchQueue.global(qos: .background).async {
var request = URLRequest(url: URL(string: videoUrl)!)
request.httpMethod = "GET"
_ = session.dataTask(with: request, completionHandler: { (data, response, error) in
if(error != nil){
print("\n\nsome error occured\n\n")
return
}
if let response = response as? HTTPURLResponse{
if response.statusCode == 200{
DispatchQueue.main.async {
if let data = data{
if let _ = try? data.write(to: destinationUrl, options: Data.WritingOptions.atomic){
print("\n\nurl data written\n\n")
}
else{
print("\n\nerror again\n\n")
}
}//end if let data
}//end dispatch main
}//end if let response.status
}
}).resume()
//}//end dispatch global
}//end outer else
Run Code Online (Sandbox Code Playgroud)
现在播放保存的文件:
class MyViewController: UIViewController {
override func viewDidLoad() {
let baseUrl = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
let assetUrl = baseUrl.appendingPathComponent("MyFileSaveName.mp4")
let url = assetUrl
print(url)
let avAssest = AVAsset(url: url)
let playerItem = AVPlayerItem(asset: avAssest)
let player = AVPlayer(playerItem: playerItem)
let playerViewController = AVPlayerViewController()
playerViewController.player = player
self.present(playerViewController, animated: true, completion: {
player.play()
})
}
}
Run Code Online (Sandbox Code Playgroud)
但是,大多数站点不提供视频的直接 dwonloadable 链接。您可以通过在 a 中播放视频来获取该链接,UIWebView并注册以下观察者以获取该链接:
NotificationCenter.default.addObserver(self, selector: #selector(videoPlayedInWebView), name: NSNotification.Name(rawValue: "AVPlayerItemBecameCurrentNotification"), object: nil)
@objc func videoPlayedInWebView(aNotification: NSNotification) {
if let playerItem: AVPlayerItem = aNotification.object as? AVPlayerItem{
let asset: AVURLAsset = playerItem.asset as! AVURLAsset
var downloadebaleVideoUrl = asset.url
print(downloadebaleVideoUrl)
}
}
Run Code Online (Sandbox Code Playgroud)
这里的“downloadebaleVideoUrl”是视频在 webview 中播放后生成的链接。如果您有任何问题随时问。 注意:这仅适用于具有 mp4 文件的站点。使用此方法不会下载“HLS”流。为此,您可以参考以下答案:https : //stackoverflow.com/a/54493233/10758374
编辑:这仅适用于UIWebView,不适用于WKWebView.
您需要创建一个本地 URL,它将成为应用程序文件系统中的路径,并将视频数据写入其中。
func writeToFile(urlString: String) {
guard let videoUrl = URL(string: urlString) else {
return
}
do {
let videoData = try Data(contentsOf: videoUrl)
let fm = FileManager.default
guard let docUrl = fm.urls(for: .documentDirectory, in: .userDomainMask).first else {
print("Unable to reach the documents folder")
return false
}
let localUrl = docUrl.appendingPathComponent("test.mp4")
try videoData.write(to: localUrl)
} catch {
print("could not save data")
}
}
Run Code Online (Sandbox Code Playgroud)
请记住始终在后台线程中调用此函数。
| 归档时间: |
|
| 查看次数: |
9639 次 |
| 最近记录: |