Video Editing in iOS
potatotips #2
2013.12.11
Yusei Nishiyama
自己紹介
name : 西山勇世
twitter : @yuseinishiyama
blog : http://yuseinishiyama.com
・iOS / Unity
・動画編集 / AR
・最近は色々と拗らせてSchemeとか...

これからグイグイ

・社会人2年目(

)

くる予定
動画編集してますか??
AVFoundation便利最高!!!!
AVFoundationで出来ること
Composing a Timeline

複数の動画をつないだり...。

AVMutableComposition *composition = [AVMutableComposition
composition];
AVMutableCompositionTrack *compositionVideoTrack =
[composition addMutableTrackWithMediaType:AVMediaTypeVideo
preferredTrackID:...];
[compositionVideoTrack insertTimeRange:...
ofTrack:clipVideoTrack atTime:... error:...];
Audio Mixing

ボリュームランプをつけてみたり...。
AVMutableAudioMixInputParameters *trackMix =
[AVMutableAudioMixInputParameters
audioMixInputParametersWithTrack:mainAudioTrack];
[trackMix setVolume:1.0 atTime:kCMTimeZero];
[trackMix setVolumeRampFromStartVolume:1.0
toEndVolume:0.2
timeRange:CMTimeRangeMake(x,y-x)];
...
AVMutableAudioMix *audioMix = [AVMutableAudioMix audioMix];
audioMix.inputParameters = [NSArray arrayWithObject:trackMix];
Building Transitions
複数の動画を同時に表示したり...。
ディゾルブやコーナーワイプなどに
使えそう。
長い...

AVMutableVideoCompositionInstruction *transition =
[AVMutableVideoCompositionInstruction videoCompositionInstruction];
transition.timeRange = transitionTimeRange;
AVMutableVideoCompositionLayerInstruction *fromLayer =
[AVMutableVideoCompositionLayerInstruction
videoCompositionLayerInstructionWithAssetTrack:trackA];
[fromLayer setOpacityRampFromStartOpacity:1.0 toEndOpacity:0.0
timeRange:transitionTimeRange];
AVMutableVideoCompositionLayerInstruction *toLayer = ...
layerInstructions = [NSArray arrayWithObjects:fromLayer, toLayer, nil];
CALayers in Movies

さらには、CALayerをオーバレイしたり
なんてことも可能!
CALayer *parentLayer = [CALayer layer];
CALayer *videoLayer = [CALayer layer];
parentLayer.frame = CGRectMake(0, 0, VIDEO_SIZE.width, VIDEO_SIZE.height);
videoLayer.frame = CGRectMake(0, 0, VIDEO_SIZE.width, VIDEO_SIZE.height);
[parentLayer addSublayer:videoLayer];
[parentLayer addSublayer:[self textLayerWithStartTime:startTime withText:text]];
videoComposition.animationTool = [AVVideoCompositionCoreAnimationTool
videoCompositionCoreAnimationToolWithPostProcessingAsVideoLayer:videoLayer
inLayer:parentLayer];
videoComposition.animationTool =
[AVVideoCompositionCoreAnimationTool
videoCompositionCoreAnimationToolWithPostProce
ssingAsVideoLayer:videoLayer
inLayer:parentLayer];
Advanced Editing
ピクセル単位での編集
• 録画やファイル読み込みなどに、低レベルの
APIを利用すればPixelBufferにアクセス可能
(cf.AVAssetReader/Writer、
AVCaptureVideoDataOutput)

• それらをCPUで編集するのは流石に重い...
→GPUで処理したい。

• なんだかんだでGPUImageがおすすめ。OpenGLの
セットアップのためにboilerplate codeを
書かなくて良いのは大きい。
一応、iOS7にも触れておくと...
・Custom Video Composition
パイプラインがより柔軟になった。
AVAssetReader/Writerに比べると、容易にpixelBufferにアクセスできるた
め、コードの見通しが良くなる。

@protocol AVVideoCompositingに
準拠したクラス。
Summary
• AVFoundationには、動画編集を柔軟に
行うためのAPIが多数存在する。

• GPUImageを使用することで、
OpenGLを利用したピクセル単位での処
理が簡単に行える。
More Information
• WWDC 2011
Working with Media in AVFoundation

• WWDC 2013
Advanced Editing with AV Foundation
ありがとうございました
Video Editing in iOS

Video Editing in iOS