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

AFNetworking 3.0上传文件耗时过长,如何优化视频上传速度?

上传速度优化方案

1. 请求与会话配置优化

  • 替换defaultSessionConfiguration为ephemeralSessionConfiguration,后者会禁用不必要的缓存、cookie持久化逻辑,减少上传时的额外开销
  • 不要用uploadTaskWithStreamedRequest搭配内存中的videoData,直接把视频写入本地临时文件后调用appendPartWithFileURL方法,避免内存加载整个文件带来的额外耗时,同时AFN会自动优化流读取逻辑
  • 手动配置请求超时时间,默认的超时时间可能会触发慢启动重传,设置request.timeoutInterval = 30适配大文件上传场景

2. 传输逻辑优化

  • 确认服务端支持HTTP/2协议,NSURLSession会自动适配HTTP/2,多路复用特性可以大幅减少TCP握手开销,上传速度可提升30%以上
  • 如果视频文件大于10M,建议拆分成分片并行上传,服务端做好分片合并逻辑,避免单文件上传失败需要全量重传的问题,同时充分利用上行带宽
  • 检查mimeType配置是否和服务端要求匹配,错误的mimeType会触发服务端额外校验逻辑,延长响应时间

3. 视频压缩优化补充

  • 除了画质压缩,还可以调整视频码率、帧率,5秒的普通场景视频可以把码率降到1Mbps以内,文件大小可以控制在1M以内,上传耗时会大幅缩短
  • 检查压缩后的视频编码格式,优先用H.264编码,兼容性最好,不需要服务端转码额外等待

优化后的代码参考

// 先把压缩后的视频写入本地临时路径
NSString *tempPath = [NSTemporaryDirectory() stringByAppendingPathComponent:@"temp_upload.mp4"];
[videoData writeToFile:tempPath atomically:YES];

NSMutableURLRequest *request = [[AFHTTPRequestSerializer serializer] multipartFormRequestWithMethod:@"POST" URLString:@"urlOfServer" parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
    // 用本地文件URL代替内存Data
    [formData appendPartWithFileURL:[NSURL fileURLWithPath:tempPath] name:@"fileName" fileName:@"filename.mp4" mimeType:@"video/mp4" error:nil];
} error:nil];
request.timeoutInterval = 30;

// 用临时会话配置减少开销
AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:[NSURLSessionConfiguration ephemeralSessionConfiguration]];

NSURLSessionUploadTask *uploadTask = [manager uploadTaskWithRequest:request fromFile:nil progress:^(NSProgress * _Nonnull uploadProgress) {
    dispatch_async(dispatch_get_main_queue(), ^{
        NSLog(@"PERCENTAGE UPLOADED %f",uploadProgress.fractionCompleted);
    });
} completionHandler:^(NSURLResponse * _Nonnull response, id  _Nullable responseObject, NSError * _Nullable error) {
    // 上传完成后删除临时文件
    [[NSFileManager defaultManager] removeItemAtPath:tempPath error:nil];
    if (error) {
        NSLog(@"Error: %@", error);
    } else {
        NSLog(@"%@ %@", response, responseObject);
    }
}];

[uploadTask resume];

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 04:15:01