You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 21:27:45