美文网首页程序员
iOS视频文件转码压缩

iOS视频文件转码压缩

作者: wufei1423 | 来源:发表于2019-09-30 10:29 被阅读0次

最近一直都是在做即时通讯APP相关的东西,一般在即时通讯中都会有发送视频的功能。发送视频的基本流程都是先上传视频文件,然后把视频文件的URL放在消息体中发送出去,通过传输层协议TCP或UDP。其中免不了要对视频文件进行转码压缩,因为对于那种几分钟左右的高清视频,动不动几百M的大小,实在是影响APP的性能和用户体验。我在下面代码中封装了一个同步的视频转码压缩接口:

- (BOOL)compressVideoWithAsset:(AVURLAsset *)asset outputPath:(NSString *)outputPath {
    dispatch_group_t group = dispatch_group_create();
    dispatch_group_enter(group);
    // 转码配置,建议选择AVAssetExportPresetMediumQuality
    AVAssetExportSession *exportSession = [[AVAssetExportSession alloc] initWithAsset:asset presetName:AVAssetExportPresetMediumQuality];
    exportSession.shouldOptimizeForNetworkUse = YES;
    // 设置视频转码输出路径
    exportSession.outputURL = [NSURL fileURLWithPath:outputPath];
    // 文件输出类型,更改该值也可以改变视频的压缩比例
    exportSession.outputFileType = AVFileTypeMPEG4;
    [exportSession exportAsynchronouslyWithCompletionHandler:^{
        dispatch_group_leave(group);
    }];
    // 等待转码结果
    dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
    AVAssetExportSessionStatus exportStatus = exportSession.status;
    // 转码成功
    if (exportStatus == AVAssetExportSessionStatusCompleted) {
        return YES;
    } else {
        return NO;
    }
}

可以采取如下的调用方式:

NSString *videoPath = [NSString stringWithFormat:@"%@/%lld.mp4", NSTemporaryDirectory(), (long long)([[NSDate date] timeIntervalSince1970] * 1000)];
BOOL compressResult = [self compressVideoWithAsset:urlAsset outputPath:videoPath];
// 压缩成功
if (compressResult) {
    NSData *fileData = [NSData dataWithContentsOfURL:[NSURL fileURLWithPath:videoPath] options:(NSDataReadingMappedIfSafe) error:NULL];
}

上面的视频转码方案采用是系统提供的API,有条件的可以自己研发一套转码方案。希望本文可以帮助大家。

相关文章

网友评论

    本文标题:iOS视频文件转码压缩

    本文链接:https://www.haomeiwen.com/subject/pookuctx.html