Странное поведение зависания AVMutableComposition при использовании AVMutableVideoComposition
Я пытаюсь объединить несколько видео с помощьюAVMutableComposition
, Проблема, с которой я сталкиваюсь, заключается в том, что всякий раз, когда я пытаюсьAVMutableVideoComposition
для применения каких-либо инструкций мое воспроизведение останавливается вAVPlayer
в точности 6 секунд.
Еще одна интересная вещь - это то, что он играет нормально, если я воспроизведу его в приложении Photos для iPad после экспорта с использованиемvideoComposition
, Так почему же он замерзает вAVPlayer
в 6 секунд?
Код:
AVMutableComposition *mutableComposition = [AVMutableComposition composition];
AVMutableCompositionTrack *videoCompositionTrack = [mutableComposition addMutableTrackWithMediaType:AVMediaTypeVideo
preferredTrackID:kCMPersistentTrackID_Invalid];
AVMutableCompositionTrack *audioCompositionTrack = [mutableComposition addMutableTrackWithMediaType:AVMediaTypeAudio
preferredTrackID:kCMPersistentTrackID_Invalid];
for (AVURLAsset *asset in assets)
{
AVAssetTrack *assetTrack;
assetTrack = [[asset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0];
AVAssetTrack *audioAssetTrack = [asset tracksWithMediaType:AVMediaTypeAudio].firstObject;
NSError *error;
[videoCompositionTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, assetTrack.timeRange.duration )
ofTrack:assetTrack
atTime:time
error:&error];
if (error) {
NSLog(@"asset url :: %@",assetTrack.asset);
NSLog(@"Error1 - %@", error.debugDescription);
}
[audioCompositionTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, audioAssetTrack.timeRange.duration)
ofTrack:audioAssetTrack
atTime:time
error:&error];
if (error) {
NSLog(@"Error2 - %@", error.debugDescription);
}
time = CMTimeAdd(time, assetTrack.timeRange.duration);
if (CGSizeEqualToSize(size, CGSizeZero)) {
size = assetTrack.naturalSize;;
}
}
AVMutableVideoCompositionInstruction *mainInstruction = [AVMutableVideoCompositionInstruction videoCompositionInstruction];
AVMutableVideoCompositionLayerInstruction *videoTrackLayerInstruction = [AVMutableVideoCompositionLayerInstruction videoCompositionLayerInstructionWithAssetTrack:videoCompositionTrack];
mainInstruction.timeRange = CMTimeRangeMake(kCMTimeZero, time);
mainInstruction.layerInstructions = [NSArray arrayWithObjects:videoTrackLayerInstruction, nil];
AVMutableVideoComposition *mainCompositionInst = [AVMutableVideoComposition videoComposition];
mainCompositionInst.instructions = [NSArray arrayWithObject:mainInstruction];
mainCompositionInst.frameDuration = CMTimeMake(1, 30);
mainCompositionInst.renderSize = size;
pi = [AVPlayerItem playerItemWithAsset:mutableComposition];
pi.videoComposition = mainCompositionInst;
Кроме того, я знаю, что проблема в основномvideoComposition
потому что если я уберуvideoComposition
тогда он играет нормально наAVPlayer
.
ОБНОВЛЕНИЕ 1: Я только что узнал, что когда он зависает через 6 секунд, если я перетащить ползунок назад или вперед (т. Е. ИспользоватьseekToTime
), он снова начинает нормально играть, не останавливаясь.
Кроме того, звук продолжает играть нормально, даже когда видео заморожено.
ОБНОВЛЕНИЕ 2: Если я просто продолжу и экспортирую его, используяAVAssetExportSession
с тем жеAVMutableComposition
и загрузить ресурс из экспортированного видео, он работает нормально. Так что только когда я играюAVMutableComposition
напрямую возникает проблема.