尝试在 iOS swift 上下载本地视频
try to download video locall on iOS swift
我正在尝试单击按钮将视频下载到我的 phone。
我正在使用以下内容:
@IBAction func startDownload(_ sender: AnyObject) {
let videoImageUrl = "http://www.sample-videos.com/video/mp4/720/big_buck_bunny_720p_1mb.mp4"
dispatch_async.global(DispatchQueue.(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), {
let url = NSURL(string: videoImageUrl);
let urlData = NSData(contentsOfURL: url! as URL);
if(urlData != nil)
{
let documentsPath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .userDomainMask, true)[0];
let filePath="\(documentsPath)/tempFile.mp4";
dispatch_async(DispatchQueue.main, {
urlData?.writeToFile(filePath, atomically: true);
PHPhotoLibrary.sharedPhotoLibrary().performChanges({
PHAssetChangeRequest.creationRequestForAssetFromVideoAtFileURL(NSURL(fileURLWithPath: filePath))
}) { completed, error in
if completed {
print("Video is saved!")
}
}
})
}
})
}
没有任何成功。
我遇到“无法使用类型为 (Int, Int) 的参数列表调用 'global'”
以及 PHPhotoLIbrary 和 PHAssetChangeRequest 的未解析标识符
有人知道这是怎么回事吗?
非常感谢:)
-- 编辑--
@IBAction func startDownload(_ sender: UIButton) {
let videoImageUrl = "https://my-video.mp4"
DispatchQueue.global(qos: .default).async {
let url = NSURL(string: videoImageUrl);
let urlData = NSData(contentsOf: url! as URL);
if(urlData != nil)
{
let documentsPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0];
let filePath="\(documentsPath)/tempFile.mp4";
DispatchQueue.main.async {
urlData?.write(toFile: filePath, atomically: true);
PHPhotoLibrary.shared().performChanges({
PHAssetChangeRequest.creationRequestForAssetFromVideo(atFileURL: NSURL(fileURLWithPath: filePath) as URL)
}) { completed, error in
if completed {
print("Video is saved!")
}
}
}
}
}
}
您的代码有几处错误。
首先是你使用调度队列的方式。
后台队列的正确做法是:
DispatchQueue.global(qos: .default).async {
// Code ...
}
或主队列:
DispatchQueue.main.async {
// Code ...
}
其次,为了使用Photos
框架,您需要导入它。在文件顶部添加 import Photos
。
第三,Swift3 中有几个 API 更改,但编译器应该提供自动修复它们的功能(例如,您应该使用 URL
和 Data
无处不在,而不是 NSURL
或 NSData
)。或者,您可以通过转到 Edit
-> Convert
-> To Current Swift Syntax
将 Swift 2 项目转换为 Swift 3 项目
最后,你下载视频的方式不对,它会在保存到磁盘之前完全加载到内存中。如果视频很大,这会导致问题。查看 URLSession
API 以了解将资源直接下载到文件中的方法。
我正在尝试单击按钮将视频下载到我的 phone。
我正在使用以下内容:
@IBAction func startDownload(_ sender: AnyObject) {
let videoImageUrl = "http://www.sample-videos.com/video/mp4/720/big_buck_bunny_720p_1mb.mp4"
dispatch_async.global(DispatchQueue.(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), {
let url = NSURL(string: videoImageUrl);
let urlData = NSData(contentsOfURL: url! as URL);
if(urlData != nil)
{
let documentsPath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .userDomainMask, true)[0];
let filePath="\(documentsPath)/tempFile.mp4";
dispatch_async(DispatchQueue.main, {
urlData?.writeToFile(filePath, atomically: true);
PHPhotoLibrary.sharedPhotoLibrary().performChanges({
PHAssetChangeRequest.creationRequestForAssetFromVideoAtFileURL(NSURL(fileURLWithPath: filePath))
}) { completed, error in
if completed {
print("Video is saved!")
}
}
})
}
})
}
没有任何成功。
我遇到“无法使用类型为 (Int, Int) 的参数列表调用 'global'”
以及 PHPhotoLIbrary 和 PHAssetChangeRequest 的未解析标识符
有人知道这是怎么回事吗?
非常感谢:)
-- 编辑--
@IBAction func startDownload(_ sender: UIButton) {
let videoImageUrl = "https://my-video.mp4"
DispatchQueue.global(qos: .default).async {
let url = NSURL(string: videoImageUrl);
let urlData = NSData(contentsOf: url! as URL);
if(urlData != nil)
{
let documentsPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0];
let filePath="\(documentsPath)/tempFile.mp4";
DispatchQueue.main.async {
urlData?.write(toFile: filePath, atomically: true);
PHPhotoLibrary.shared().performChanges({
PHAssetChangeRequest.creationRequestForAssetFromVideo(atFileURL: NSURL(fileURLWithPath: filePath) as URL)
}) { completed, error in
if completed {
print("Video is saved!")
}
}
}
}
}
}
您的代码有几处错误。
首先是你使用调度队列的方式。 后台队列的正确做法是:
DispatchQueue.global(qos: .default).async {
// Code ...
}
或主队列:
DispatchQueue.main.async {
// Code ...
}
其次,为了使用Photos
框架,您需要导入它。在文件顶部添加 import Photos
。
第三,Swift3 中有几个 API 更改,但编译器应该提供自动修复它们的功能(例如,您应该使用 URL
和 Data
无处不在,而不是 NSURL
或 NSData
)。或者,您可以通过转到 Edit
-> Convert
-> To Current Swift Syntax
最后,你下载视频的方式不对,它会在保存到磁盘之前完全加载到内存中。如果视频很大,这会导致问题。查看 URLSession
API 以了解将资源直接下载到文件中的方法。