アプリなどを開発するブログ

React Native / Swift / Ruby on Railsなどの学習メモ。


AVFoundationで動画をリサイズする(+関連記事まとめ)

現在AVFoundationで動画撮影アプリを作っているのですが、
日本語のドキュメントがあまりないですね。
しかも結構他にない概念が多かったりして公式の英語ドキュメントを読んで理解するのは
結構骨が折れます。

で、動画リサイズするのは以下みたいな感じでできました。
リサイズだけなら他に簡単なやり方があったりするんでしょうか。
とりあえず回転とかもさせたいので以下でやりました。

// 書き出した動画をリサイズ
+(void)exportVideoFile:(AVAsset *)_asset toPath:(NSString *)filePath
{
    AVAsset* asset = _asset;

    // -----------------------------------------------------------------
    //  タイムラインを用意する
    // -----------------------------------------------------------------

    // 映像と音声を編集するための入れ物を用意する(ビデオ編集ソフトでいうタイムライン?)
    AVMutableVideoComposition* videoComposition = [AVMutableVideoComposition videoComposition];
    videoComposition.renderSize = CGSizeMake(VIDEO_SIZE, VIDEO_SIZE);   // 動画のサイズを決める
    videoComposition.frameDuration = CMTimeMake(1, VIDEO_FRAME_RATE);   // 動画のフレームレートを決める

    // 動画に変換などの処理を加えるための構造体
    AVMutableVideoCompositionInstruction *instruction = [AVMutableVideoCompositionInstruction videoCompositionInstruction];
    instruction.timeRange = CMTimeRangeMake(kCMTimeZero, CMTimeMakeWithSeconds(VIDEO_SECONDS, VIDEO_FRAME_RATE) );




    // -----------------------------------------------------------------
    //  縮小などの変換を行う
    // -----------------------------------------------------------------

    // 渡されたAssetの中からビデオトラックを抜き出す
    AVAssetTrack *videoTrack = [[asset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0];

    // ビデオトラックを変換するためのLayerInstruction を抜き出す
    AVMutableVideoCompositionLayerInstruction* transformer = [AVMutableVideoCompositionLayerInstruction videoCompositionLayerInstructionWithAssetTrack:videoTrack];
    
    // 縮小する /  他にも回転させたりしたいならここで。
    float shortMember = MIN(videoTrack.naturalSize.height, videoTrack.naturalSize.width);
    float scaleRate = VIDEO_SIZE / shortMember;

    CGAffineTransform shrinkTransform = CGAffineTransformMakeScale(scaleRate, scaleRate);
    [transformer setTransform:shrinkTransform atTime:kCMTimeZero];




    // -----------------------------------------------------------------
    //  変換を適用する
    // -----------------------------------------------------------------
    instruction.layerInstructions = [NSArray arrayWithObject:transformer];
    videoComposition.instructions = [NSArray arrayWithObject:instruction];



    // -----------------------------------------------------------------
    //  動画に書き出す
    // -----------------------------------------------------------------
    AVAssetExportSession *exportSession;
    exportSession = [[AVAssetExportSession alloc] initWithAsset:asset presetName:AVAssetExportPresetMediumQuality];
    exportSession.videoComposition = videoComposition;

    [[NSFileManager defaultManager] removeItemAtPath:filePath error:nil];
    exportSession.outputURL = [NSURL fileURLWithPath:filePath];
    exportSession.outputFileType = AVFileTypeMPEG4;
    [exportSession exportAsynchronouslyWithCompletionHandler:^
    {
        switch ([exportSession status])
        {
            case AVAssetExportSessionStatusFailed:
            {
                // 失敗
                break;
            }

            case AVAssetExportSessionStatusCancelled:
            {
                // キャンセルされた
                break;
            }

            case AVAssetExportSessionStatusCompleted :
            {
                // 成功
                break;
            }
        }
    }];
}

AVFoundationで動画編集してる日本語記事をまとめ

AVFoundationで動画の加工合成処理

http://qiita.com/KUMAN/items/a2a1e903b26b062d2d79

ビデオカメラアプリの作り方(2) - ビデオ画像の表示

http://news.mynavi.jp/column/iphone/041/

iPhoneで動作する映像フィルタをつくる

http://nvtrlab.jp/blog/andy/iphone%E3%81%A7%E5%8B%95%E4%BD%9C%E3%81%99%E3%82%8B%E6%98%A0%E5%83%8F%E3%83%95%E3%82%A3%E3%83%AB%E3%82%BF%E3%82%92%E3%81%A4%E3%81%8F%E3%82%8B%EF%BC%93%EF%BC%88gpuimageios%E3%81%AEavfoundation.html

http://nvtrlab.jp/blog/andy/iphone%E3%81%A7%E5%8B%95%E4%BD%9C%E3%81%99%E3%82%8B%E6%98%A0%E5%83%8F%E3%83%95%E3%82%A3%E3%83%AB%E3%82%BF%E3%82%92%E3%81%A4%E3%81%8F%E3%82%8B5%EF%BC%88gpuimageios%E3%81%AEavfoundation%E3%83%95.html

[iOS] 動画を加工・編集する(1) 指定した時間の範囲を切り出す

http://chicketen.blog.jp/archives/3375376.html

AV Foundation Frameworkを利用して動画の結合を行う

http://nakajijapan.github.io/blog/2013/10/22/how-to-combine-some-movies-with-avfoundation/

iOS:CMTimeの使い方まとめ

http://blog.livedoor.jp/sen_ritsu/archives/51342320.html

OpenCVを利用したリアルタイムフィルタリングの基本

http://dev.classmethod.jp/smartphone/iphone/opencv-video/