2013-09-29 6 views
5

Ich arbeite mit der Änderung einiger Videos über AVMutableVideoCompositionLayerInstruction im iOS7 SDK.iOS7 AVMutableVideoCompositionLayerInstruction bewirkt, dass der Videoframe einfriert

Der folgende Code verwendet, um auf iOS 6.1.3 zu arbeiten, aber in iOS7 ist das Video auf dem ersten Frame eingefroren (obwohl ich immer noch das Audio ok hören kann). Ich habe alle tatsächlichen Transformationen, die ich anwendete, losgeworden, um zu verifizieren, dass das Hinzufügen einer Videokomposition allein Probleme verursacht.

AVURLAsset* videoAsset = [[AVURLAsset alloc] initWithURL:inputFileURL options:NULL]; 
AVAssetTrack *videoAssetTrack = [[videoAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0]; 

AVMutableVideoCompositionLayerInstruction *layerInstruction = 
[AVMutableVideoCompositionLayerInstruction videoCompositionLayerInstructionWithAssetTrack:videoAssetTrack]; 

AVMutableVideoComposition *mainComposition = [AVMutableVideoComposition videoComposition]; 
AVMutableVideoCompositionInstruction *mainInstruction = [AVMutableVideoCompositionInstruction videoCompositionInstruction]; 
mainInstruction.layerInstructions = [NSArray arrayWithObject:layerInstruction]; 
mainInstruction.timeRange = CMTimeRangeMake(kCMTimeZero, videoAsset.duration); 
mainComposition.instructions = [NSArray arrayWithObject:mainInstruction]; 
mainComposition.frameDuration = videoAsset.duration; 
mainComposition.renderSize = CGSizeMake(320, 320); 

... 
exportSession.videoComposition = mainComposition; 

Wenn ich nicht setzen das videoComposition Attribut exportSession dann die Video-Aufzeichnungen in Ordnung, aber ich kann keine Transformationen anwenden. Wer weiß, was das verursachen könnte?

Danke.

+0

Das gleiche hier, keine Hilfe im Internet –

Antwort

0

Eine gute Möglichkeit, Probleme mit der Videomischung zu beheben, ist die Verwendung [AVMutableVideoComposition videoCompositionWithPropertiesOfAsset:asset]. Die zurückgegebene AVMutableVideoComposition sollte ordnungsgemäß funktionieren. Dann können Sie den Inhalt des Arrays instructions mit Ihren Anweisungen vergleichen.

Um die Konfusionspegel zu erhöhen, kann die asset auch eine AVComposition sein. Ich denke, die AVFoundation Team hat nicht die beste Arbeit bei der Benennung dieser Dinge ....

1

Ich habe auch mit AVMutableVideoCompositionLayerInstruction gekämpft und Video mit CALayers mischen. Nach ein paar Tagen versuche ich verschiedene Wege, was ich realisiere ist, dass die Zeit der Assets ziemlich wichtig ist. Der richtige Weg, um die Zeit eines jeden Vermögenswert, um herauszufinden, ist die Eigenschaft:

loadValuesAsynchronouslyForKeys: @ [@ "Dauer"]

//Asset url 
    NSURL *assetUrl = [NSURL fileURLWithPath:_firstVideoFilePath]; 

    //audio/video assets 
    AVURLAsset * videoAsset = [[AVURLAsset alloc]initWithURL:assetUrl options:nil]; 

    //var to store the duration 
    CMTime __block durationTime; 

    //And here we'll be able to proper get the asset duration 
    [videoAsset loadValuesAsynchronouslyForKeys:@[@"duration"] completionHandler: ^{ 
     Float64 durationSeconds = CMTimeGetSeconds([videoAsset duration]); 
     durationTime = [videoAsset duration]; 
     //At this point you have the proper asset duration value, you can start any video processing from here. 
    }]; 

Hope this mit dem gleichen Problem zu jemandem hilft .