最終的な目標は、480x640 .movビデオを、正確な解像度480x360の4:3の比率の横向きビデオにトリミングすることです。
私はこのリンクで提起されたほぼ正確な質問を知っています: AVFoundationを使用してビデオをトリミングするにはどうすればよいですか?
すでにトリミングされているプレビューレイヤーを表示し、最後に最後の(トリミングされていないポートレート480x640)ビデオをトリミングする方が簡単だと思います。私は以下のコードで遊んでいます。現時点では、何かを変換するためにそれを取得しようとしています-そこには、後で削除する無関係なコードがあります。次のコードは、ビデオを70%にスケーリングしようとします。
-(void) convertVideoToSize{
AVURLAsset *videoToConvert = [AVURLAsset URLAssetWithURL:[NSURL fileURLWithPath:tempURL] options:nil];
AVMutableComposition *mixComposition = [[AVMutableComposition alloc] init];
AVMutableCompositionTrack *firstTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid];
[firstTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, videoToConvert.duration) ofTrack:[[videoToConvert tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0] atTime:kCMTimeZero error:nil];
AVMutableVideoCompositionInstruction *mainInstruction = [AVMutableVideoCompositionInstruction videoCompositionInstruction];
mainInstruction.timeRange = CMTimeRangeMake(kCMTimeZero,videoToConvert.duration);
AVMutableVideoCompositionLayerInstruction *firstLayerInstruction = [AVMutableVideoCompositionLayerInstruction videoCompositionLayerInstructionWithAssetTrack:firstTrack];
//WE PERFORM VIDEO EDITING OPERATIONS HERE
CGAffineTransform translateToCenter = CGAffineTransformMakeTranslation( 0,-420);
CGAffineTransform Rotate = CGAffineTransformMakeRotation(M_PI_2);
CGAffineTransform Scale = CGAffineTransformMakeScale(1.0f,1.0f);
CGAffineTransform shrinkWidth = CGAffineTransformMakeScale(1, 1);
CGAffineTransform finalTransform = CGAffineTransformConcat(shrinkWidth, CGAffineTransformConcat(translateToCenter, Rotate) );
[firstLayerInstruction setTransform:finalTransform atTime:kCMTimeZero];
//[firstLayerInstruction setTransform:CGAffineTransformConcat(Rotate,Scale) atTime:kCMTimeZero];
//[firstLayerInstruction setTransform:Scale atTime:kCMTimeZero];
mainInstruction.layerInstructions = [NSArray arrayWithObject:firstLayerInstruction];
AVMutableVideoComposition *mainCompositionInst = [AVMutableVideoComposition videoComposition];
mainCompositionInst.instructions = [NSArray arrayWithObject:mainInstruction];
mainCompositionInst.frameDuration = CMTimeMake(1,30);
mainCompositionInst.renderSize = CGSizeMake(480, 360);
//AVPlayerItem *newPlayerItem = [AVPlayerItem playerItemWithAsset:mixComposition];
//newPlayerItem.videoComposition = mainCompositionInst;
AVAssetExportSession *exportSession = [[AVAssetExportSession alloc] initWithAsset:mixComposition presetName:AVAssetExportPresetMediumQuality];
exportSession.outputURL = [NSURL fileURLWithPath:tempURL3];
exportSession.videoComposition = mainCompositionInst;
exportSession.outputFileType = AVFileTypeQuickTimeMovie;
[exportSession exportAsynchronouslyWithCompletionHandler:^
{
switch (exportSession.status)
{
case AVAssetExportSessionStatusFailed:
{
NSLog (@"FAIL");
break;
}
case AVAssetExportSessionStatusCompleted:
{
NSLog (@"SUCCESS");
break;
}
case AVAssetExportSessionStatusCancelled:
{
NSLog (@"CANCELED");
break;
}
};
}];
}
動作せず、読み取り不可能な.movファイルを出力します。誰かが私をもっと簡単な方向に向けたり、ビデオの変更/スケーリングを行うための最良の方法を教えてくれるのではないかと思っていました。
更新:ビデオをtransformed.movファイルに保存すると、それを再生しようとすると、QuickTimeで「ムービーのファイル形式が認識されません」というエラーが表示されます。腐敗の可能性のある原因は誰ですか?
更新2:変換を書き込むためのエクスポートセッションとコンポジションを正常に設定しました。今、私は自分の480x640を480x360に変換できるようにする特定の変換が必要です。何か助けはありますか?