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

如何在Swift中将大视频分割为5MB大小的分片

Swift实现大视频按5MB分片分割

核心实现逻辑

通过FileHandle操作本地视频文件,按固定5MB(5 * 1024 * 1024字节)的块大小逐段读取原文件内容,将每段内容写入独立的分片文件,同时处理文件操作中的异常情况,确保资源正确释放。

完整代码实现

import Foundation

func splitVideoFile(at sourcePath: String, to outputDirectory: String, chunkSize: Int = 5 * 1024 * 1024) throws -> [String] {
    // 验证源文件是否存在
    guard FileManager.default.fileExists(atPath: sourcePath) else {
        throw NSError(domain: "VideoSplitterError", code: 1, userInfo: [NSLocalizedDescriptionKey: "源视频文件不存在"])
    }
    
    // 创建输出目录(如果不存在)
    try FileManager.default.createDirectory(atPath: outputDirectory, withIntermediateDirectories: true)
    
    let sourceFileHandle = try FileHandle(forReadingFrom: URL(fileURLWithPath: sourcePath))
    defer { sourceFileHandle.closeFile() }
    
    let fileSize = try FileManager.default.attributesOfItem(atPath: sourcePath)[.size] as! UInt64
    let totalChunks = Int(ceil(Double(fileSize) / Double(chunkSize)))
    var chunkPaths: [String] = []
    
    for chunkIndex in 0..<totalChunks {
        let chunkFileName = "video_chunk_\(chunkIndex).mp4"
        let chunkPath = (outputDirectory as NSString).appendingPathComponent(chunkFileName)
        
        // 写入分片文件
        let chunkFileHandle = try FileHandle(forWritingTo: URL(fileURLWithPath: chunkPath))
        defer { chunkFileHandle.closeFile() }
        
        let offset = UInt64(chunkIndex * chunkSize)
        sourceFileHandle.seek(toFileOffset: offset)
        
        let bytesToRead = min(UInt64(chunkSize), fileSize - offset)
        let data = sourceFileHandle.readData(ofLength: Int(bytesToRead))
        
        chunkFileHandle.write(data)
        chunkPaths.append(chunkPath)
    }
    
    return chunkPaths
}

// 使用示例
do {
    let sourceVideoPath = "/path/to/your/large_video.mp4"
    let outputDir = "/path/to/output/chunks"
    let chunkPaths = try splitVideoFile(at: sourceVideoPath, to: outputDir)
    print("分片完成,共生成\(chunkPaths.count)个分片,路径如下:")
    chunkPaths.forEach { print($0) }
} catch {
    print("分片失败:\(error.localizedDescription)")
}

注意事项

  • 确保应用拥有文件读取/写入权限,iOS端需配置NSDocumentDirectory或使用文件选择器获取合法路径
  • 分片文件为原始视频的二进制片段,上传完成后需在服务端完成合并操作
  • 可通过修改chunkSize参数调整分片大小,代码默认设置为5MB

内容的提问来源于stack exchange,提问作者Mathew

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 01:20:39