如何在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
相关产品推荐
相关产品推荐

