iOS obraca każdą klatkę wideo

Muszę obrócić film, ponieważ aparat iPhone z powrotem nagrywa tak, jakby zawsze znajdował się po lewej stronie. Muszę fizycznie obracać wideo, ponieważ orientacja ustawień nie działa we wszystkich przeglądarkach (np. Chrome). Dlatego ustawiam kod do odczytu nagranego wideo i zapisywania go po obrocie. Użyłem AVAssetExportSession, który wydaje się działać całkiem dobrze z dwoma problemami: - eksportowane wideo ma na początku kilka czarnych ramek - niektóre filmy nie będą eksportowane.

Czy można mieć jakiś wgląd w problem? Dzięki!

Kod:

AVAsset* asset = [AVURLAsset URLAssetWithURL: videoUrl options:nil];

AVMutableComposition *composition = [AVMutableComposition composition];
AVMutableCompositionTrack *compositionVideoTrack = [composition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid];

AVMutableCompositionTrack *compositionAudioTrack = [composition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid];


AVAssetTrack *videoTrack = [[asset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0];
AVAssetTrack *audioTrack = [[asset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0];
[compositionVideoTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, asset.duration) ofTrack:videoTrack atTime:kCMTimeZero error: &error];

[compositionVideoTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, asset.duration) ofTrack:audioTrack atTime:kCMTimeZero error: &error];

AVMutableVideoCompositionInstruction *instruction = [AVMutableVideoCompositionInstruction videoCompositionInstruction];
instruction.timeRange = CMTimeRangeMake( kCMTimeZero, asset.duration);

AVMutableVideoCompositionLayerInstruction *layerInstruction = [AVMutableVideoCompositionLayerInstruction videoCompositionLayerInstructionWithAssetTrack:compositionVideoTrack];
  [layerInstruction setTransform:transformToApply atTime:kCMTimeZero];

CGAffineTransform transformToApply = ///code to setup transformation 
[layerInstruction setTransform:transformToApply atTime:kCMTimeZero];
[layerInstruction setOpacity:0.0 atTime:asset.duration];

instruction.layerInstructions = [NSArray arrayWithObject: layerInstruction];

AVMutableVideoComposition *videoComposition = [AVMutableVideoComposition videoComposition];
videoComposition.instructions = [NSArray arrayWithObject: instruction];


videoComposition.frameDuration = CMTimeMake( 1, 600);
videoComposition.renderScale = 1.0;
videoComposition.renderSize =  videoOutputSize;

AVAssetExportSession *exportSession = [[AVAssetExportSession alloc] initWithAsset:asset presetName:AVAssetExportPresetMediumQuality] ;
exportSession.outputURL = self.outputUrl;
exportSession.outputFileType = AVFileTypeQuickTimeMovie;
exportSession.videoComposition = videoComposition;
exportSession.shouldOptimizeForNetworkUse = YES;
exportSession.timeRange = CMTimeRangeMake(kCMTimeZero, asset.duration);

__block BOOL finishedExporting = NO;
[exportSession exportAsynchronouslyWithCompletionHandler:^{

    //
}];

questionAnswers(0)

yourAnswerToTheQuestion