うるおいらんど

アプリ開発やサイト制作のメモとか。

【Swift 3】UIImageの配列から動画を生成する【AVAssetWriter】

魚ライン
魚ライン

どもも。

UIImageから動画生成がやっとある程度形になったので紹介していきます。

といっても詳しくは端折り、コードと行き詰まりポイント程度にしておきます。

なのでまずは全体コードから。

 

全体コード

MovieCreator.swift

 

呼び出したい場所(適当なViewController)

 

あとはつまずきポイントの説明だけしたいと思います。

動画の保存先URL

最初に動画をどこに書き出すかを指定しています。

これがまた色々やったんですが、上手くできず・・・。

上記コードの大部分が「複数枚のUIImageから動画を生成したい」を参考にさせていただいているのですが、うまいこと解決できず、結局こんな感じになりました。

 

1フレームの長さ

1枚の写真をどれだけの時間表示するか、ということなのですが、なんか結構はまりました。

この辺です。

 

このCMTimeは、「[Swift]CMTimeを使う」を参考にさせていただきなんとか解決。というか使い方をよくわかっていなかっただけでした。

CMTime(a,b)は a / b 秒を表しています。

durationForEachImage = 1

fps = 60とします。

1枚目の画像 0(frameCount) × 1  / 60 = 0 なので開始位置は0

2枚目の画像 1(frameCount) × 1 / 60 = 0.016 なので開始位置は0.016秒

3枚目の画像 2(frameCount) × 1 / 60 = 0.033 なので開始位置は 0.033秒

といった風になります。

この a / b を1 / 1とした場合は、1秒に1枚画像を表示します。

実際に時間がどのように変わっているのか見る場合はCMTimeGetSeconds() で確認できます。

 

動画のサイズ

今回一番ハマりました。まじでわけがわからんかった・・・

結論からいうと、画像の横幅は16の倍数でなければなりません。

それに気づかないとこんなことになります。



めっちゃずれてます。じゃみじゃみです。

横幅が16の倍数だとちゃんと表示されます。

これはこちらの「How do I export UIImage array as a movie in Swift 3?」のページのコードを見ていて気づきました。

 

意外と情報自体はあるのに、なかなか上手くいかなかった動画生成でした・・・。

 

とりあえずは一番大きい山を越えたかなぁといった感じ。本当に今月中旬までには新しいアプリ出します〜。

ではでは

魚ライン
モッピー!お金がたまるポイントサイト
魚ライン

Swiftの記事一覧を見る

コメント

コメントは認証制です。詳しくは下記の注意をお読みください。

コメントを残す

コメント時の注意

「Twitter」「Facebook」「Google+」「WordPress」のいずれかのアカウントをお持ちの方は各アカウントと連携することでコメントできます。 コメントしたことはSNSに流れませんので、アカウントをお持ちの方はこちらの方法でコメントを投稿して下さると嬉しいです。 アカウントをお持ちでない方はメールアドレスで投稿することができます。 初回コメント時は承認後に表示されます。

魚ライン 魚ライン