您的位置:首页 > 移动开发 > IOS开发

avfoundation 视频合成 ,合成两段视频和一段音频

2016-05-27 19:29 471 查看
一下代码少部分逻辑没有补全,并不影响阅读,请自省补全吧,

例如有些变量我都不粘贴了

第一段:合并

- (IBAction)mergeClick:(id)sender {

    if (self.firstAsset !=nil && self.secondAsset!=nil) {

        self.activityView.hidden = NO;

        [self.activityView startAnimating];

        

        // 1 - Create AVMutableComposition object. This object will hold your AVMutableCompositionTrack instances.

        AVMutableComposition *mixComposition = [[AVMutableComposition alloc] init];

        // 2 - Video track

        AVMutableCompositionTrack *firstTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeVideo

                                                                            preferredTrackID:kCMPersistentTrackID_Invalid];

        [firstTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, self.firstAsset.duration)

                            ofTrack:[self.firstAsset tracksWithMediaType:AVMediaTypeVideo].firstObject atTime:kCMTimeZero error:nil];

        

        [firstTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, self.secondAsset.duration)

                            ofTrack:[self.secondAsset tracksWithMediaType:AVMediaTypeVideo].firstObject atTime:self.firstAsset.duration error:nil];

    

        // 3 - Audio track

        if (self.audioAsset!=nil){

            AVMutableCompositionTrack *audioTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeAudio

                                                                                preferredTrackID:kCMPersistentTrackID_Invalid];

            [audioTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, CMTimeAdd(self.firstAsset.duration, self.secondAsset.duration))

                                ofTrack:[self.audioAsset tracksWithMediaType:AVMediaTypeAudio].firstObject atTime:kCMTimeZero error:nil];

        }

        

        // 4 - Get path

        NSString *path =  [[GG sharedInstance].docPath stringByAppendingPathComponent:

                                 [NSString stringWithFormat:@"mergeVideo-%d.mov",arc4random() % 1000]];

        NSURL *url = [NSURL fileURLWithPath:path];

        // 5 - Create exporter

        AVAssetExportSession *exporter = [[AVAssetExportSession alloc] initWithAsset:mixComposition

                                                                          presetName:AVAssetExportPresetHighestQuality];

        exporter.outputURL=url;

        exporter.outputFileType = AVFileTypeQuickTimeMovie;

        exporter.shouldOptimizeForNetworkUse = YES;

        [exporter exportAsynchronouslyWithCompletionHandler:^{

            dispatch_async(dispatch_get_main_queue(), ^{

                [self exportDidFinish:exporter];

            });

        }];

    }

}


第二段:合并后输出

-(void)exportDidFinish:(AVAssetExportSession*)session{

    if (session.status == AVAssetExportSessionStatusCompleted) {

        NSURL *outputURL = session.outputURL;

        ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];

        if ([library videoAtPathIsCompatibleWithSavedPhotosAlbum:outputURL]) {

            [library writeVideoAtPathToSavedPhotosAlbum:outputURL completionBlock:^(NSURL *assetURL, NSError *error){

                dispatch_async(dispatch_get_main_queue(), ^{

                    if (error) {

                        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error" message:@"Video Saving Failed"

                                                                       delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];

                        [alert show];

                    } else {

                        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Video Saved" message:@"Saved To Photo Album"

                                                                       delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];

                        [alert show];

                    }

                });

            }];

        }

    }else{

        NSLog(@"export failed");

        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"export failed" message:[NSString stringWithFormat:@"status=%zd, error=%@", session.status, session.error]

                                                       delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];

        [alert show];

    }

    self.audioAsset = nil;

    self.firstAsset = nil;

    self.secondAsset = nil;

    [self.activityView stopAnimating];

    self.activityView.hidden = YES;

    

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ios avfoundation 视频