我创建了一个包含多个视频剪辑的合成,我还添加了一些空白范围,我用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层。
还有其他人遇到类似问题吗?
答案 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)
插入空时间范围在某些情况下有效,但是当我们让用户快退/快进并在时间栏上更改时,我们发现它不够好。为了解决这个问题,我们在没有显示任何其他内容的情