美文网首页程序员
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