iOS从远程链接下载MP4并保存至Documents目录的实现方法
解决方案:将远程MP4下载保存到Documents目录并本地播放
核心思路
视频无需像图片那样转换为特定对象,直接将下载的二进制数据写入带.mp4后缀的本地文件即可,系统会通过文件后缀与内容识别为MP4视频。以下是具体实现步骤:
1. 优化下载逻辑:直接保存到Documents目录
你可以选择修改原下载方法直接完成保存,或在回调中处理文件写入:
方式一:修改下载方法直接保存(Swift)
@objc func downloadAndSaveVideo(surl: NSString, completion: @escaping (URL?) -> Void) { guard let remoteURL = URL(string: String(surl)) else { completion(nil) return } let session = URLSession(configuration: .default) let task = session.dataTask(with: remoteURL) { data, response, error in guard let videoData = data, error == nil else { print("下载失败: \(error?.localizedDescription ?? "未知错误")") completion(nil) return } // 获取应用私有Documents目录 guard let docsDir = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first else { completion(nil) return } // 生成本地文件URL(必须带.mp4后缀) let fileName = remoteURL.lastPathComponent // 保留原文件名,或自定义如"local_video.mp4" let localFileURL = docsDir.appendingPathComponent(fileName) do { // 将二进制数据写入本地文件 try videoData.write(to: localFileURL) DispatchQueue.main.async { completion(localFileURL) // 返回本地路径供播放使用 } } catch { print("保存文件失败: \(error.localizedDescription)") DispatchQueue.main.async { completion(nil) } } } task.resume() }
方式二:在原下载回调中处理保存(Swift)
若需保留原下载方法,拿到NSData后执行写入:
// 调用原下载方法 download(surl: "你的远程MP4链接") { nsData in let videoData = nsData as Data // 获取Documents目录 guard let docsDir = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first else { return } // 定义本地文件路径 let localFileURL = docsDir.appendingPathComponent("saved_video.mp4") do { try videoData.write(to: localFileURL) // 保存成功后调用本地播放方法 self.playLocalVideo(url: localFileURL as NSURL) } catch { print("保存失败: \(error.localizedDescription)") } }
2. 本地MP4播放实现(Objective-C)
你的原播放方法已支持本地URL,只需稍作优化避免重复添加图层:
#import <AVFoundation/AVFoundation.h> -(void)playLocalVideo:(NSURL*)localURL { AVPlayer *player = [AVPlayer playerWithURL:localURL]; AVPlayerLayer *playerLayer = [AVPlayerLayer playerLayerWithPlayer:player]; playerLayer.frame = self.videoView.bounds; // 移除旧的播放图层(避免重复叠加) for (CALayer *layer in self.videoView.layer.sublayers) { if ([layer isKindOfClass:[AVPlayerLayer class]]) { [layer removeFromSuperlayer]; break; } } [self.videoView.layer addSublayer:playerLayer]; [player play]; // 直接启动播放 }
关键注意事项
- 必须添加
.mp4后缀:系统依赖文件后缀识别视频类型,无后缀可能导致AVPlayer无法解析。 - 无需转换视频对象:MP4是二进制格式,直接写入磁盘即可,AVPlayer可直接加载本地文件URL。
- 目录权限:Documents是应用私有目录,无需额外权限,仅应用自身可访问,符合你不存入相册的需求。
调用示例
// 下载并自动播放 downloadAndSaveVideo(surl: "https://example.com/target.mp4") { localURL in if let url = localURL { self.playLocalVideo(url: url as NSURL) } }
内容的提问来源于stack exchange,提问作者user6631314
相关产品推荐
相关产品推荐

