

AVCaptureMovieFileOutputを使って撮影した動画を正方形にリサイズしたいです。

撮影時にはpreviewとして正方形にしたUIViewに以下のプロパティを指定したAVCaptureVideoPreviewLayerを設定しています。

[code]

    videoGravity = AVLayerVideoGravityResizeAspectFill
    
[/code]

previewでは正方形ですが、当然実ファイル（動画)はiPhoneのカメラサイズ（長方形)なので、  
それをpreviewと同じように正方形でリサイズしたいと思っています。

何かいい方法をご存知の方、ご教授いただければ幸いです。


CC BY-SA 3.0
2016-08-29T09:43:02.013
28555
2016-08-29T11:42:26.207
8831
question
swift swift2
AVCaptureMovieFileOutputで撮影した動画を正方形にリサイズしたい


英語の記事ですが、このような内容のものが見つかりました。

[Record square video in iOS](http://www.netwalk.be/article/record-square-
video-ios)

撮影されてファイルの形で保存されたビデオを編集して正方形のビデオを出力するという内容ですので、ほぼご質問の趣旨に沿っているのではないかと思います。

今は実際にビデオ撮影を行うサンプルアプリを作る暇がありませんので、記事中のObjective-
CコードをSwift2に変換したものだけ掲載しておきます。ご自分のアプリに組み込めそうでしたら一度お試しいただければと思います。

[code]

        // output file
        guard let docURL = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask).last else {
            print("Failed to find Document directory")
            return
        }
        let outputURL = docURL.URLByAppendingPathComponent("output2.mov")
        if NSFileManager.defaultManager().fileExistsAtPath(outputURL.path!) {
            _ = try? NSFileManager.defaultManager().removeItemAtURL(outputURL)
        }
    
        // input file
        let asset = AVAsset(URL: fileURL)
    
        let composition = AVMutableComposition()
        composition.addMutableTrackWithMediaType(AVMediaTypeVideo, preferredTrackID: kCMPersistentTrackID_Invalid)
    
        // input clip
        let clipVideoTrack = asset.tracksWithMediaType(AVMediaTypeVideo)[0]
    
        // make it square
        let videoComposition = AVMutableVideoComposition()
        videoComposition.renderSize = CGSize(width: clipVideoTrack.naturalSize.height, height: clipVideoTrack.naturalSize.height)
        videoComposition.frameDuration = CMTimeMake(1, 30)
    
        let instruction = AVMutableVideoCompositionInstruction()
        instruction.timeRange = CMTimeRangeMake(kCMTimeZero, CMTimeMakeWithSeconds(60, 30))
    
        // rotate to portrait
        let transformer = AVMutableVideoCompositionLayerInstruction(assetTrack: clipVideoTrack)
        let t1 = CGAffineTransformMakeTranslation(clipVideoTrack.naturalSize.height, -(clipVideoTrack.naturalSize.width - clipVideoTrack.naturalSize.height) / 2)
        let t2 = CGAffineTransformRotate(t1, CGFloat(M_PI_2))
    
        let finalTransform = t2
        transformer.setTransform(finalTransform, atTime: kCMTimeZero)
        instruction.layerInstructions = [transformer]
        videoComposition.instructions = [instruction]
    
        // export
        guard let exporter = AVAssetExportSession(asset: asset, presetName: AVAssetExportPresetHighestQuality) else {
            print("Failed to create AVAssetExportSession")
            return
        }
        exporter.videoComposition = videoComposition
        exporter.outputURL = outputURL
        exporter.outputFileType = AVFileTypeQuickTimeMovie
    
        exporter.exportAsynchronouslyWithCompletionHandler {
            NSLog("Exporting done!")
        }
    
[/code]

(撮影済みビデオが`fileURL`に(元記事なら`filePath`に)存在するという前提でこのコードを走らせるとDocumentディレクトリ内に"output2.mov"と言う名前の変換済みファイルができる、と言うことのようです。)

変換ミスなど、何かお気付きの点があればコメント等でお知らせください。


CC BY-SA 3.0
2016-08-29T11:42:26.207
28556
2016-08-29T11:42:26.207
13972
28555
answer