SlideShare a Scribd company logo
1 of 42
OSCのLTネタを


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


「はてブ」で炎上した話だよ!!
お前誰よ
• お仕事


サーバーインフラ園児にあ


• 趣味


酒、本、ボードゲーム


• 住んでるとこ


岐阜(名古屋の植民地)


• 最近のあ


バクシン!バクシン!
炎上ニアが


結婚式のエンドロールを


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


@2box2bo
2020年12月12日に


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


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


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


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


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


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


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


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


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


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


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


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


• 結婚式の列席者はお互いの家族のみ


(ほぼLINE利用ユーザー)


• 他のタスク盛りだくさんなので、手間はかけれない…
PythonとAWSで頑張る方針
で、何が出来上がったか
全体構成
画像保存部
• ユーザーからのインターフェイスは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

More from 2bo 2bo

Pillowの使い方
Pillowの使い方Pillowの使い方
Pillowの使い方2bo 2bo
 
PEP8を読んでみよう
PEP8を読んでみようPEP8を読んでみよう
PEP8を読んでみよう2bo 2bo
 
Raspberry p ionzabbixproxy
Raspberry p ionzabbixproxyRaspberry p ionzabbixproxy
Raspberry p ionzabbixproxy2bo 2bo
 
Djangoとweb2pyをapacheに組込む
Djangoとweb2pyをapacheに組込むDjangoとweb2pyをapacheに組込む
Djangoとweb2pyをapacheに組込む2bo 2bo
 
Raspberry piの紹介
Raspberry piの紹介Raspberry piの紹介
Raspberry piの紹介2bo 2bo
 
Cent osにpyhtonをインストールしてみよう
Cent osにpyhtonをインストールしてみようCent osにpyhtonをインストールしてみよう
Cent osにpyhtonをインストールしてみよう2bo 2bo
 

More from 2bo 2bo (6)

Pillowの使い方
Pillowの使い方Pillowの使い方
Pillowの使い方
 
PEP8を読んでみよう
PEP8を読んでみようPEP8を読んでみよう
PEP8を読んでみよう
 
Raspberry p ionzabbixproxy
Raspberry p ionzabbixproxyRaspberry p ionzabbixproxy
Raspberry p ionzabbixproxy
 
Djangoとweb2pyをapacheに組込む
Djangoとweb2pyをapacheに組込むDjangoとweb2pyをapacheに組込む
Djangoとweb2pyをapacheに組込む
 
Raspberry piの紹介
Raspberry piの紹介Raspberry piの紹介
Raspberry piの紹介
 
Cent osにpyhtonをインストールしてみよう
Cent osにpyhtonをインストールしてみようCent osにpyhtonをインストールしてみよう
Cent osにpyhtonをインストールしてみよう
 

結婚式のエンドロールを「Pythonで」当日作った話