AVMutableCompositionTrack和AVMutableVideoComposition问题中没有视频的范围

时间:2012-04-10 08:51:30

标签: ios avfoundation

我创建了一个包含多个视频剪辑的合成,我还添加了一些空白范围,我用CoreAnimation显示标题画面。

|--Video1--|--NoVideo(AVsyncLayer)--|--Video2--|

等等......一切正常,我开始使用时会出现问题: AVMutableVideoComposition,AVMutableVideoCompositionInstruction和AVMutableVideoCompositionLayerInstruction,我必须正确地旋转视频。

|--Video1--|--NoVideo(AVsyncLayer)--|

在我的AVPlayer中正常工作,但如果我改为:

|--NoVideo(AVsyncLayer)--|--Video1--|

下次推送新视图控制器时,应用程序崩溃,或者在我的导航控制器堆栈中弹出当前视图控制器。有时会在没有它的情况下发出记忆警告,但根据仪器我只分配了1.5Mb。

我曾多次在WWDC上看过AVFoundation中的Working With Media,我唯一能想到的就是评论

  

AVMutableVideoCompositionInstruction不得重叠或包含间隙。

它真的没有。我有关于整个作文持续时间的说明。但AVMutableCompositionTrack(我的视频轨道)中存在空白,我不打算显示视频,只有CoreAnimation层。

还有其他人遇到类似问题吗?

3 个答案:

答案 0 :(得分:1)

扩展Erik的解决方案,这就是我所做的。我创建了一个非常简短的黑色电影剪辑,并将其添加到空白时间范围的尾端。它似乎工作正常,但我希望存在一个更优雅的解决方案。 (请注意,在我的代码中,TMAVCompositionTrack只是一个包含AVMutableCompositionTrack的音频和视频包装器以及其他一些东西。

- (void)createEmptySpaceOnTrack:(TMAVCompositionTrack*)avtrack timeRange:(CMTimeRange)timeRangeOfShot {
        [avtrack.videoCompositionTrack insertEmptyTimeRange:timeRangeOfShot];
        [avtrack.audioCompositionTrack insertEmptyTimeRange:timeRangeOfShot];

        // there is a bug where emptyness is trimmed out, so put a brief burst of video blackness at the end of the "emptyness"
        NSURL* assetURL = [[NSBundle mainBundle] URLForResource:@"blackness" withExtension:@"mov"];
        AVAsset* asset = [AVURLAsset URLAssetWithURL:assetURL options:@{ AVURLAssetPreferPreciseDurationAndTimingKey:@(YES) }];
        AVAssetTrack *clipVideoTrack = [[asset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0];
        CMTimeRange timeRangeInAsset = CMTimeRangeMake(kCMTimeZero, CMTimeMakeWithSeconds(0.01, 600));
        CMTime tailEnd = CMTimeSubtract(CMTimeRangeGetEnd(timeRangeOfShot), timeRangeInAsset.duration);
        [avtrack.videoCompositionTrack insertTimeRange:timeRangeInAsset ofTrack:clipVideoTrack atTime:tailEnd  error:nil];
    }

答案 1 :(得分:0)

您需要在轨道上使用InsertEmptyTimeRange方法,以便轨道上没有间隙。

有关详情,请参阅Extending an AVMutableComposition

答案 2 :(得分:0)

插入空时间范围在某些情况下有效,但是当我们让用户快退/快进并在时间栏上更改时,我们发现它不够好。为了解决这个问题,我们在没有显示任何其他内容的情