美文网首页
把多个视频合并为一个视频

把多个视频合并为一个视频

作者: JxSr程知农 | 来源:发表于2019-08-22 16:29 被阅读0次

+ (void)mergeWithVideoPaths:(NSArray<NSString*> *)videoPathArray withOutPath:(NSString *)outPath isSaveToPhotos:(BOOL)isSaveToPhotos {
    //若已存在目标输出文件 则直接返回掉。
    NSURL *mergeFileURL = [NSURL fileURLWithPath:outPath];
    if ([[NSFileManager defaultManager] fileExistsAtPath:outPath]) {
        NSLog(@"[warning]文件已存在");
        return;
    }
    
    AVMutableComposition *mixComposition = [AVMutableComposition composition];
    
    //音频轨道。
    AVMutableCompositionTrack *audioTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid];
    
    //视频轨道。
    AVMutableCompositionTrack *videoTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid];
    
    CMTime totalDuration = kCMTimeZero;
    for(int i=0; i < videoPathArray.count; i++) {
        if (![[NSFileManager defaultManager] fileExistsAtPath:videoPathArray[i]]) {
            NSLog(@"[error]_miss_source_file-%@", videoPathArray[i]);
            return;
        }
        
        //AVURLAsset:此类主要用于获取多媒体的信息,包括视频和音频的类型、时长、每秒帧数,其实还可以用来获取视频的指定位置的缩略图。
        //AVURLAsset *asset = [AVURLAsset assetWithURL:[NSURL URLWithString:videoPathArray[i]]];//error.
        AVURLAsset *asset = [AVURLAsset assetWithURL:[NSURL fileURLWithPath:videoPathArray[i]]];
        
        NSError *errorForAudio = nil;
        //获取AVAsset中的音频。
        AVAssetTrack *audioAssetTrack = [asset tracksWithMediaType:AVMediaTypeAudio].firstObject;
        //向通道内加入音频。
        BOOL bAudio = [audioTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, asset.duration) ofTrack:audioAssetTrack atTime:totalDuration error:&errorForAudio];
        NSLog(@"errorForAudio:%@%d", errorForAudio, bAudio);
        
        NSError *errorForVideo = nil;//获取AVAsset中的视频。
        AVAssetTrack *videoAssetTrack = [asset tracksWithMediaType:AVMediaTypeVideo].firstObject;
        //向通道内加入视频。
        BOOL bVideo = [videoTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, asset.duration) ofTrack:videoAssetTrack atTime:totalDuration error:&errorForVideo];
        NSLog(@"errorForVideo:%@%d", errorForVideo, bVideo);
        
        totalDuration = CMTimeAdd(totalDuration, asset.duration);
    }
    
    //这里开始导出合成之后的视频。
    AVAssetExportSession *exporter = [[AVAssetExportSession alloc] initWithAsset:mixComposition presetName:AVAssetExportPresetHighestQuality];
    exporter.outputURL = mergeFileURL;
    NSLog(@"exporter.supportedFileTypes = %@", exporter.supportedFileTypes);
    if ([outPath hasSuffix:@".mp4"]) {
        exporter.outputFileType = AVFileTypeMPEG4;
    } else {
        exporter.outputFileType = AVFileTypeQuickTimeMovie;
    }
    exporter.shouldOptimizeForNetworkUse = YES;
    [exporter exportAsynchronouslyWithCompletionHandler:^(void){
        //导出的状态。
        switch(exporter.status) {
            case AVAssetExportSessionStatusUnknown:
                NSLog(@"exporterUnknow.");
                break;
            case AVAssetExportSessionStatusCancelled:
                NSLog(@"exporterCanceled.");
                break;
            case AVAssetExportSessionStatusFailed:
                //导出失败。
                NSLog(@"exporterFailed \\\' %@ \'/.", exporter.error.localizedDescription);
                break;
            case AVAssetExportSessionStatusWaiting:
                NSLog(@"exporterWaiting.");
                break;
            case AVAssetExportSessionStatusExporting:
                NSLog(@"exporterExporting.");
                break;
            case AVAssetExportSessionStatusCompleted:
                //导出成功。
                NSLog(@"exporterCompleted.");
                dispatch_async(dispatch_get_main_queue(), ^{
                    //这里是回到你的主线程做一些事情。
                    if (isSaveToPhotos) {
                        //[CjhMediaManager saveVideoToPhotosWithWithUrl:exporter.outputURL];
                    }
                });
                break;
        }
    }];
}

来源: https://www.jianshu.com/p/e38db628ae0b 

相关文章

  • 把多个视频合并为一个视频

  • 视频工具箱-分屏视频

    怎么把多个视频制作成【分屏视频】,朋友圈最吸睛小视频! 分屏视频

  • iOS:GPUImage本地视频叠加

    之前看过一些视频APP,可以把多个视频嵌入到一个视频图层中,抽空研究了下,思路是使用GPUImage中的GPUIm...

  • HIbernate多对多关系映射(注解配置)

    以视频信息与用户关系为例:一个用户可以拥有多个视频,一个视频也可以同时被多个用户所拥有。

  • 三百多个视频

    我手机三到五年换一个,只存下三百多个视频,想孙女的时候,我把这些视频挨个儿看一遍,但还是没办法不想,再过几天我孙女...

  • 多个视频拼接,制定视频旋转

    这个真的很浪费时间,网上能查到视频合成,也能查到多个视频合成视频,可都是针对合成后的视频旋转,我遇到的是需要合成的...

  • 视频合并工具哪个好用?

    我们经常会用手机录制一些好玩的视频,但是当我们在手机上录制多个视频的时候,都是无法串联到一起的,有时想把很多视频合...

  • 不是坚持就会有收获

    整理一下视频号视频。把朋友圈里的视频和视频号同步一下。我的视频号已经发布了1000多个小视频了,但是点赞量和关注量...

  • iOS多个mov视频合成

    /** * 多个视频合成为一个视频输出到指定路径,注意区分是否3D视频 * * @param tArray ...

  • 介绍一个视频处理python库

    介绍一个视频处理python库 MoviePy是一个用于视频编辑的 Python 库:剪切、串联、标题插入、视频合...

网友评论

      本文标题:把多个视频合并为一个视频

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