狠狠撸

狠狠撸Share a Scribd company logo
OSCのLTネタを


再編したものですよ!
私事ですが
结婚しました
ブログに書いたら


「はてブ」で炎上した話だよ!!
お前誰よ
? お仕事
?
サーバーインフラ園児にあ


? 趣味
?
酒、本、ボードゲーム


? 住んでるとこ
?
岐阜(名古屋の植民地)


? 最近のあ
?
バクシン!バクシン!
炎上ニアが


結婚式のエンドロールを


「Pythonで」当日作った話
Python東海 第42回勉強会


@2box2bo
2020年12月12日に


結婚式を挙げました
7月くらいから式場決めて


あーだこーだやってたのですが
ワンオフだけあって色々お値段


するんですよね
で
決めた式場が「持ち込み料0円」


だったので、エンドロールを


自作してみたお話
自作した動機
? エンドロールの見積りがそこそこしたので、式の
費用圧縮をしたかった


? 二人で協力して何か作ったもの的なのがあったほ
うが面白いかな…と思った


? ただの食事会的な感じを避けて遊び要素を入れた
かった


? 「こんなことやってる/できる人」と伝えれる
前提
? 結婚式式場には早い段階でOKをもらっている


? 式場の方針としてPCから直接プロジェクターに写すのは
NG


? そのため、動画データを式場に送り、当日DVDに焼いて
もらう運用が必須


? 焼くタイミングで音楽を式場が入れる


? 上記の作業が発生するため、持ち込み料は不要だが費用
は発生


? 結婚式の列席者はお互いの家族のみ
?
(ほぼLINE利用ユーザー)


? 他のタスク盛りだくさんなので、手間はかけれない…
笔测迟丑辞苍と础奥厂で顽张る方针
で、何が出来上がったか
全体构成
画像保存部
? ユーザーからのインターフェイスはLINEでお手軽
?
(LINE Developersめっちゃ楽だた)


? ナウい感じにしたいのでAWS Lambdaを利用


? データはS3に保存


? アップロードした人のユーザー名等をDynamoDBに保存


? チュートリアル的なシンプル構成
画像加工部
? S3バケットにデータが保存されたら投稿者名を画
像に追記して別のS3バケットに保存(まどろっこし
いけど事故防止のため)


? 画像のトリミングもこのタイミングで実施


? 画像保存部もだけど、LambdaでPillow使えるよう
にするのがめんどくさかった…
動画生成部
? 動画変換時間が長すぎ、AWS Lambdaでいい感じに…とい
う夢はここで崩壊した…


? EC2に環境を作り、マルチスレッドでS3にある画像を動画化


? 生成した動画を公開用バケットにアップし、ダウンロード
URLをSESで式場に連絡


? ここの作成が一番手間取った


? ここの作業は式当日、手動で実施した
動画生成公開部
? 全部式場にお願いした部分


? 前日リハ時に式場の音響さんが目の前で音楽の長
さを調整するのは職人技だった


? 動画サイズがプロジェクター的にダメだったのが
判明したりしたので、事前リハ大事
こんな感じで準備し、
?
当日を迎えました
処理系はすべてPythonで


こしらえました
画像保存部
? LINEからのWebhookでキックされるLambda


? PILで画像を取得


? Boto3で画像のS3へのアップロードとLINE投稿者
のメタ情報をdynamoDBに書き込み


? Dynamodbにメタ情報を保存するのは投稿者情報
を画像に追記するため
?
→ 元画像も残したいのでこんな感じにしてます
が、一緒に処理できたと思う…
?
→ 画像処理周りはあとで修正しまくって、タイ
ムアップしたのでよくない作りです…
画像加工部 1
? S3アップロードでキックされるLambda


? こちらもPILで処理


? 文字入れ処理はこれ→


? 文字配置箇所の計算が
?
ちょっと頭使ったくらい


? 処理終了後にS3にアップ
?
(事故防止のため別バケット)
draw.text(
?
(
?
bg.size[0] - font_size[0] - 115,
?
bg.size[1] - font_size[1] - 80
?
),


text,
?
FONT["color"],
?
font=font,
?
stroke_width=2,
?
stroke_
fi
ll="#EEE"
?
)
画像加工部 2
? 画像のリサイズもここで実施している


? リサイズ処理は簡単だが、縦撮りと横撮りでリサ
イズする仕方が変わる


? プロジェクトの表示サイズも微妙なのも絡んで、
結構微妙な感じになった
# 画像の配置場所指定
?
p = (
?
round(((MOVIE_SIZE[0] - image.size[0]) / 2)-230),
?
round((MOVIE_SIZE[1] - image.size[1]) / 2)-20
?
)


video_frame.paste(image, p)
画像加工部 縦と横
動画生成部 1
? 処理時間からLambda利用を断念したとこ


? S3から加工済み画像をダウンロードしてMoveiPy
で動画化
?
https://zulko.github.io/moviepy/


? いろいろな機能があるが、使ったのは
「crossfadein」ど「crossfadeout」
tmp_clips = []


clip = ImageClip(local_img_
fi
le).set_duration(4)


clip = clip.crossfadein(1.2)


clip = clip.crossfadeout(1.2)


tmp_clips.append(clip)
動画生成部 2
? 処理時間の短縮はCPUパワーに頼った


? EC2の強いインスタンスサイズと
ThreadPoolExecutorでの並列処理


? これだけで並列処理できるのは素敵
?
????
? 当日はc5.4xlargeで10並列処理
?
137個の画像を10分程度で動画化
with ThreadPoolExecutor(max_workers=WOKER_NUM, thread_name_pre
fi
x="thread") as executor:


for m in local_img_
fi
les:


print(m)


executor.submit(create_movie_parts, m)
動画生成部 3
? 生成した動画はS3の公開バケットにアップロード
し、ダウンロードURLをSESから送信したメールで
通知


? SESもboto3で簡単に利用可能だった


? S3バケットは式が終了次第非公開に変更


? このあたりの運用はかなり雑運用
结婚式当日、何が起きたか
结婚式のエンドロールを「笔测迟丑辞苍で」当日作った话
うまく動かなくてクソ焦ってる
新郎写真を撮られました
结婚式のエンドロールを「笔测迟丑辞苍で」当日作った话
インスタンス再起動で


ゴット事なきでしたが…
素人にはおすすめしない…
動画生成部を1回動かすと連続で動かせない事象があるのを
?
前日に気づいていたのですが、


当日朝のテスト稼働で動かしたまま再起動を忘れていたという…
その他効能
? 列席者は楽しんでくれた


? 列席できないペットの写真もアップされてた


? 失敗写真的なのもあったがそれはそれで笑えた


? 予想の倍の写真がアップされ、エンドロールの時
間が10分となった
?
(スケジュール調整は式場の人に助けられました…)


? メインのフランベタイムを動画作成時間に当てた
結果、メイン以降のご飯の味を覚えてない…
结婚式のエンドロールを「笔测迟丑辞苍で」当日作った话
とりあえず無事に終わることは
?
できました…
コードとかはblogに
?
書いてあります
https://
2bolog.zumwalt.info/
2021/01/17/create-2bo-
wedding-endroll/
まとめ
? 時間的制限があったので、コードの綺麗さよりも動くことを優先


? コピペプログラミング最高


? 動画化の部分が一番時間かかった


? GPUインスタンスにドライバいれてGPU処理とか色々やりました
が、思ったほどはやくならず…
?
(うまく設定できてなかった可能性が高い)


? Lambdaはサードパーティのライブラリ使うのがめんどくさい
?
https://github.com/keithrozario/Klayers は神
?
? 簡単に早くできるのはCPUパワー!!


? どうせ1時間もかからない処理だからマシマシインスタンスにして
パワーで殴るという学び

More Related Content

结婚式のエンドロールを「笔测迟丑辞苍で」当日作った话