Экспорт обрезанного видео - разные результаты для передней / задней камеры

Я пытаюсь взять видео с камеры и экспортировать его в виде квадрата. Я тестирую его на iPad Air с передней и задней камерой.

Все хорошо работает, когда я снимаю видео с задней камеры - видео обрезается так, как я хочу. К сожалению, оно обрезается неправильно, когда я пытаюсь экспортировать видео, снятое с фронтальной камеры.

Перевод кажется неправильным, потому что у меня большие черные полосы внизу видео. Кто-нибудь знает, что я делаю не так?

Примечание: я тестирую его на iOS 9 - не уверен, что это может быть источником проблемы.

- (AVComposition *)trimmedAndCroppedVideoComposition
{
    AVMutableComposition *composition = [AVMutableComposition composition];

    AVURLAsset *sourceAsset = [[AVURLAsset alloc] initWithURL:self.media.videoURL
                                                      options:@{AVURLAssetPreferPreciseDurationAndTimingKey: @(YES)}];
    CMTimeRange timeRange = self.media.trimmedVideoRange;
    [composition insertTimeRange:timeRange ofAsset:sourceAsset atTime:kCMTimeZero error:nil];

    AVAssetTrack *track =  [[sourceAsset tracksWithMediaType:AVMediaTypeVideo] firstObject];
    AVMutableCompositionTrack *compositionTrack = [[composition tracksWithMediaType:AVMediaTypeVideo] firstObject];

    CGSize videoSize = CGSizeApplyAffineTransform(track.naturalSize, track.preferredTransform);
    videoSize = CGSizeMake(fabs(videoSize.width), fabs(videoSize.height));

    CGFloat fillScale = MAX(self.renderSize.width / videoSize.width,
                            self.renderSize.height / videoSize.height);

    CGAffineTransform orientationTransform = track.preferredTransform;
    if (orientationTransform.tx == videoSize.width || orientationTransform.tx == videoSize.height) {
        orientationTransform.tx = self.renderSize.width;
    }

    if (orientationTransform.ty == videoSize.width || orientationTransform.ty == videoSize.height) {
        orientationTransform.ty = self.renderSize.width;
    }

    CGAffineTransform t1 = CGAffineTransformScale(CGAffineTransformIdentity, fillScale, fillScale);
    CGAffineTransform t2 = CGAffineTransformConcat(t1, orientationTransform);
    CGRect cropRect = CGRectMake(0, 0.5, 1, 0.5);
    CGAffineTransform t3 = CGAffineTransformConcat(t2, CGAffineTransformMakeTranslation
                                                   (-cropRect.origin.x * videoSize.width * fillScale,
                                                    -cropRect.origin.y * videoSize.height * fillScale));
    compositionTrack.preferredTransform = t3;
    return [composition copy];
}

- (void)_exportVideo:(void (^)(void))completion
{   
    // Trimmed and cropped Asset
    AVComposition *trimmedAsset = [self trimmedAndCroppedVideoComposition];

    // Input clip
    AVAssetTrack *clipVideoTrack = [[trimmedAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0];

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

    // Apple transform
    AVMutableVideoCompositionLayerInstruction* transformer = [AVMutableVideoCompositionLayerInstruction
                                                              videoCompositionLayerInstructionWithAssetTrack:clipVideoTrack];
    CGAffineTransform finalTransform = clipVideoTrack.preferredTransform;
    [transformer setTransform:finalTransform atTime:kCMTimeZero];
    instruction.layerInstructions = [NSArray arrayWithObject:transformer];

    // Make it square
    AVMutableVideoComposition* videoComposition = [AVMutableVideoComposition videoComposition];
    videoComposition.renderSize = CGSizeMake(self.renderSize.width,
                                             self.renderSize.height);
    videoComposition.frameDuration = CMTimeMake(1, 30);
    videoComposition.instructions = [NSArray arrayWithObject: instruction];

    // Export
    self.exporter = [[AVAssetExportSession alloc] initWithAsset:trimmedAsset presetName:AVAssetExportPresetMediumQuality];
    self.exporter.videoComposition = videoComposition;
    self.exporter.outputURL=[NSURL fileURLWithPath:outputPath];
    self.exporter.outputFileType=AVFileTypeQuickTimeMovie;

    [self.exporter exportAsynchronouslyWithCompletionHandler:^(void){
        ...
    }];
}

0 ответов

Другие вопросы по тегам