Ich versuche, mehrere Videos mit AVMutableComposition
zusammenzuführen. Das Problem, dem ich gegenüberstehe, ist, dass jedes Mal, wenn ich versuche, irgendwelche hinzuzufügen, meine Wiedergabe in AVPlayer
zu genau 6 Sekunden Dauer einfriert.Das seltsame Verhalten von AVMutableComposition wird eingefroren, während AVMutableVideoComposition verwendet wird
Eine andere interessante Sache ist, dass es gut spielt, wenn ich es in Fotos App von iPad nach dem Exportieren mit derselben videoComposition
spielen. Also, warum friert es in AVPlayer
um 6 Sekunden?
Code:
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;
Auch ich weiß Problem ist meist videoComposition
, denn wenn ich die videoComposition
entfernen, dann spielt es auf AVPlayer
in Ordnung.
UPDATE 1: Ich habe gerade herausgefunden, dass, wenn es nach 6 Sekunden friert, wenn ich den Regler zurück oder nach vorne ziehen (das heißt seekToTime
verwenden.), Beginnt es wieder normal ohne weitere Einfrieren zu spielen.
Auch Audio wird weiterhin gut wiedergegeben, auch wenn das Video eingefroren ist.
UPDATE 2: mit AVAssetExportSession
mit gleichen AVMutableComposition
und Last Vermögenswert aus dem exportierten Video Wenn ich es einfach weitermachen und exportieren, es funktioniert gut. So ist es nur, wenn ich AVMutableComposition
direkt spielen, Problem entsteht.
Ich hatte das gleiche Problem, irgendein Glück? – naresh
Wieder; das passiert immer noch. Kann bitte jemand hier reagieren? –
@Julian Nicht in der Lage, dies bis jetzt zu lösen. Beendet mit dem Exportieren, was mit Warten verbunden ist. Kein Problem nach dem Angebot von Kopfgeld auch. Bleib dran und hoffe, dass es irgendwann bemerkt wird. – blancos