2015-07-14 5 views
6

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.

+1

Ich hatte das gleiche Problem, irgendein Glück? – naresh

+0

Wieder; das passiert immer noch. Kann bitte jemand hier reagieren? –

+0

@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

Antwort

0

Endlich habe ich die Lösung, dies zu beheben.

Sie sollten spielen, nachdem der Status von playerItem auf .ReadyToPlay geändert wurde.

Bitte siehe unten.

Verwandte Themen