OStack程序员社区-中国程序员成长平台

标题: ios - 使用 AVMutableComposition 合并视频的问题 [打印本页]

作者: 菜鸟教程小白    时间: 2022-12-13 01:29
标题: ios - 使用 AVMutableComposition 合并视频的问题

我正在使用 iOS 设备录制短视频片段,然后尝试将多个片段合并为一个较大的视频。一切正常,除了在最终视频中,在每个剪辑片段之间它会闪烁第一个剪辑的第一帧。

比如我要合并clip1、clip2、clip3。结果是(clip1)->(clip1的第一帧)->(clip2)->(clip1的第一帧)->(clip3)

这是我用来合并它们的代码。

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

AVMutableCompositionTrack* compositionVideoTrack = [mainComposition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid];
AVMutableCompositionTrack* compositionAudioTrack = [mainComposition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid];

CMTime insertTime = kCMTimeZero;

for (NSURL* clip in self.sessionClips)
{
    AVURLAsset* asset = [AVURLAsset URLAssetWithURL:clip options{AVURLAssetPreferPreciseDurationAndTimingKeyYES}];

    AVAssetTrack* videoAssetTrack = [[asset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0];
    AVAssetTrack* audioAssetTrack = [[asset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0];

    [compositionVideoTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, videoAssetTrack.timeRange.duration) ofTrack:videoAssetTrack atTime:insertTime error:nil];
    [compositionAudioTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, audioAssetTrack.timeRange.duration) ofTrack:audioAssetTrack atTime:insertTime error:nil];

    insertTime = CMTimeAdd(insertTime, videoAssetTrack.timeRange.duration);
}

/* Export the video */
NSURL* exportURL = [NSURL fileURLWithPath:[NSString stringWithFormat"%@merged-video%@", NSTemporaryDirectory(), @".mov"]];

AVAssetExportSession* exporter = [[AVAssetExportSession alloc] initWithAsset:mainComposition presetName:AVAssetExportPresetPassthrough];

[exporter setOutputURL:exportURL];
[exporter setOutputFileType:AVFileTypeMPEG4];

[exporter exportAsynchronouslyWithCompletionHandler:^(void){
    /* Finished exporting, save to photo album */
    [[[ALAssetsLibrary alloc] init] writeVideoAtPathToSavedPhotosAlbum:exportURL completionBlock:^(NSURL* assetURL, NSError *error) {
        if (error)
            NSLog(@"%@", error);
    }];

}];

所有的视频片段都是通过 AVAssetWriter 使用 fileType:AVFileTypeQuickTimeMovie 录制的。

编辑:还想添加,如果我下载视频片段并将它们与我的 Mac 上的 MP4Box 之类的东西合并,则生成的视频很好。

谢谢!



Best Answer-推荐答案


我能够解决这个问题。

我的问题是我将较小的剪辑录制为 AVFileTypeQuickTimeMovie,但随后尝试将视频导出为 AVFileTypeMPEG4。将较小的剪辑录制为 AVFileTypeMPEG4 解决了该问题。

关于ios - 使用 AVMutableComposition 合并视频的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25654566/






欢迎光临 OStack程序员社区-中国程序员成长平台 (https://ostack.cn/) Powered by Discuz! X3.4