多機能なビデオエディター「Film Story」をリリースしました!ということで、今回はAVFoundationを用いた動画アプリの開発でハマったところなどについて
前回の記事で紹介したFilm Storyを本日リリースしました。
iMovieより簡単!? 多機能なビデオエディター「Film Story」を申請したので、その開発フローを公開します!
動画の編集処理について
Film StoryはiMovieのような動画編集アプリなのですが、このアプリを開発するにあたり、これまで使ったことがなかったAVFoundation周りの機能を色々と利用することになりました。
こちらのAVFoundationで動画の加工合成処理という記事で紹介されているクラス図が全体を俯瞰するのにいいのですが、動画編集アプリはこの中の「動画の加工/編集に必要なクラス群」を駆使して作ることになります。
「動画/写真の撮影に必要なクラス群」にまとめられているAVCaptureXxxなど、カメラ周りの処理は結構サンプルも豊富なため開発の敷居はそれほど高くなく、実際これまでフィルタカメラなどの開発で使ってきましたが、そこまでハマる場面は多くはありませんでした。ただ、今回のAVCompositionやAVAssetExportSessionなどの動画処理周りはそれと比較して情報量が少ないため、いざやろうと思ってもどこから手を付けてよいものか良く分からない、というケースが多いと思われます。
開発のとっかかり
まずは色々と情報を探してみたのですが、イマイチ体系立てて理解できるところがないなあと思っていた所、iOS4プログラミングブックに動画編集の記載があったことを思い出しました。この書籍の第3章「ビデオの編集とエクスポート」という記事があるのですが、ここに動画の合成から、動画へのテロップ合成方法など、動画編集の基礎となる部分がひと通り解説されています。
少し古い本ですが、これを読んでから色々と理解が早くなったので、動画編集処理よく分からん、という人はとりあえず買ってみればいいと思います。おすすめ。
- 作者: 畑圭輔,加藤寛人,坂本一樹,藤川宏之,高橋啓治郎,沖田知彦,柳澤昇
- 出版社/メーカー: インプレスジャパン
- 発売日: 2011/01/27
- メディア: 単行本(ソフトカバー)
- 購入: 26人 クリック: 910回
- この商品を含むブログ (33件) を見る
WWDCの資料
その他参考になるのはWWDCの資料です。
- 2010年のEditing Media with AV Foundation
iOS4が出た時のものですので、上記書籍はこの内容の解説記事だと思われます。
- 2013年のAdvanced Editing with AV Foundation
iOS7から利用できるようになったCustom Video Compositorの紹介なのですが、それよりもComposition Model というところで図解されている、動画と動画の間のトランジションをどういう風に切り出して処理するか、というモデルが大変参考になりました。
ハマった所
さて、動画の処理について全部書いてもいいのですが、上記の書籍以上に分かりやすいものにはなりませんので、ハマった所で特にクリティカルだった所についてご紹介。これから作る人はお気をつけください。
1. VideoTrackでハマる
AVMutableCompositionでコンポジションを生成し、そこにビデオとオーディオトラックを複数枠追加、最終的に全部のトラックが合成されて出力されるのですが、このビデオトラックに上限があります(iOS5までは4個まで、iOS6からは16個まで)。
当初はサンプルコードに基いて開発を進めていたため、1つの写真/動画を1トラックに追加してユーザーが100枚選択したら100トラックになるような設計だったのですが、これを再生してみると17枚目に入ったら動画が真っ黒になる、という現象になりました。エラーも何も出力されません。
動画を再生する際、その構成要素であるAVComposition, AVVideoComposition, AVAudioMixの再生時間が一致しないと動画が黒くなるのでこれかと思っていたのですが、デバッグを進めるうちに上限があることが分かったため、解決策として予め2トラックのみ生成して使いまわす、という設計に変更しました。
これが開発の初期段階で見つかればよかったものの、全部完成して最後のテスト時に発見したのでかなり大規模工事になって辛かった…。発見から全部解決まで3日くらい。
2. AVAssetExportSessionでハマる
トラック数の設計変更後、AVPlayerでの再生は何の問題もなかったのですが、色々試しているとAVAssetExportSessionでの動画書き出しで落ちるようになりました。こちらについてはエラーが出ていたのですが、「原因不明のエラーが発生しました。」というエラーでどうしようもなく…。
色々とコードを削って行くと、オーディオトラックについてもビデオトラックと同様、一定数を使いまわす設計に変更したのが関係していました。こちらは予め3トラック(再生中, 次の再生用, バックグラウンド音楽)作っていたのですが、トラックの枠だけ生成していて、そこに音楽データを入れていない、つまり空のトラックがある場合に落ちるようでした。
こちらは最終的に空のトラックを削除するようにして解決。半日くらい。
3. AVAssetWriterでハマる
Film Storyでは静止画を動画に変換する処理が入っているのですが、この変換処理にAVAssetWriterを使っています。この処理では元の写真サイズに応じて動画のサイズを決定しているのですが、iOS4端末の場合、ここで1920x1080を指定すると落ちていました。
調べてみるとAVAssetExportSessionでの書き出しもiOS4では1920x1080という一番大きなサイズを指定できないようで、下記メソッドで判定できるようだったのでこれで解決。
[[AVAssetExportSession allExportPresets] containsObject:AVAssetExportPreset1920x1080]
まとめ
上記以外にもいくつかハマりどころはあったのですが、特にダメージが大きかったのがこの3つです。1番についてはiOS7以上のみ対応で端末の性能としては十分だから、とパフォーマンスよりも開発工数を重視したのがそもそもよくなかったところだとも思います。
あとは開発は常に5Sで行って、最後のテスト段階でサポート範囲の下位端末(iPhone4)を初めて使ったのもよろしくなかったです。iPhone4でちょくちょく開発していれば途中で気付けたものが多数。
ということで皆様もお気をつけ下さい。
Film Story、無料版がありますので、ぜひ使ってみてください。