ios - 如何在 AVMutableComposition 中使用多个轨道

标签 ios avfoundation avassetexportsession avmutablecomposition avasset

请看下面的代码。我正在尝试添加第二首轨道,以便在背景视频之上叠加一个较小的视频。但是我只能让背景视频显示在最终导出的文件中。我究竟做错了什么?我如何控制轨道的顺序,即合成的层次?

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

    NSURL* backgroundURL = [NSURL fileURLWithPath:backgroundOutputPath];        
    AVURLAsset* url0 = [AVURLAsset URLAssetWithURL:backgroundURL options:nil];        

    AVMutableCompositionTrack *backgroundVideoTrack = [composition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid];

    AVAssetTrack* bgAssetTrack = [[url0 tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0];
    [backgroundVideoTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, [url0 duration])  ofTrack:bgAssetTrack atTime:kCMTimeZero error:&error];

     NSURL* videoURL = [[NSBundle mainBundle] URLForResource: @"star" withExtension:@"mp4"];
     AVURLAsset* url = [AVURLAsset URLAssetWithURL:videoURL options:nil];

     AVMutableCompositionTrack *compositionVideoTrack = [composition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid];

     AVAssetTrack *clipVideoTrack = [[url tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0];
     [compositionVideoTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, [url duration])  ofTrack:clipVideoTrack atTime:kCMTimeZero error:&error];



    AVAssetExportSession *exportSession = [[AVAssetExportSession alloc] initWithAsset:composition presetName:AVAssetExportPresetMediumQuality];


    NSString *exportPath = [documentsDirectoryPath stringByAppendingPathComponent:@"test_AV.mp4"];

    [[NSFileManager defaultManager] removeItemAtPath:exportPath error:nil];
    NSURL *exportURL = [NSURL fileURLWithPath:exportPath];

    exportSession.outputURL = exportURL;
    exportSession.outputFileType = AVFileTypeQuickTimeMovie;

    [exportSession exportAsynchronouslyWithCompletionHandler:^{
        NSLog (@"Exporting. status is %d",
               exportSession.status);
        switch (exportSession.status) {
            case AVAssetExportSessionStatusFailed:
            case AVAssetExportSessionStatusCompleted: {
                NSLog(@"export done");
                break;
            }
        };
    }];

最佳答案

关于ios - 如何在 AVMutableComposition 中使用多个轨道,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21487039/

相关文章:

ios - 具有kCVPixelBufferOpenGLESCompatibilityKey的AVCaptureVideoDataOutput videoSettings

ios - 将 MTLTexture 转换为 CVPixelBuffer

ios - AVMutableComposition 旋转视频文件

ios - AVExportSession 在后台运行

ios - 是否有用于在 iPhone 应用程序中设置首选项的库或框架?

ios - 如何删除以 NSLog iOS 开头的行?

swift - AVFoundation 连接视频和音频

ios - 如何在特定时间快速修剪视频

android - 将 AdMob 横幅样式更改为自定义

ios - 如何执行从 NSClassFromString 转换而来的类的类方法?