はじめに
Qiitaで記事を書くのは、何かのシステムとか技術について書くわけですが、文字だけでなく画像で説明することがあります。さらに、動画で説明したいこともあって、どうしようかなーと思ったところがきっかけです。
YouTubeとかの動画配信とかまでは完全に不要で、ちょっとしたのが必要です。狭い領域、短い時間の動画。動画編集ソフトでできるんだろうとは思うんですが、費用がかかるとかインストールがめんどくさいとかPCがそんなにいいやつじゃないとか、、、結局、そんなに大きなものは必要じゃないというところがネックで、採用に踏み切れません。
ということで、PythonのMoviePyにたどり着き、この記事です。
MoviePyの公式HP、ドキュメンテーションなどはこちら。
今回、私が作ったのソースはこちら。全部下に書いてるから、見るまでもないか。でも一応載せておこう。
できたgifアニメファイルがこういうの。内容はいいとして、Windows標準の画面録画機能のゲームバー(Win+G
)で録画したブラウザ画面から矩形に切り取って、gif画像にしました。
キャプションを入れたり、複数の動画をつなぎ合わせたり、いろいろできるようですが、調べればすぐできるので、この記事はこんな簡単なところまで。
ここで留めたのは、実際、私がそこまでしか必要としてないからです。こんなことだけのために動画編集ソフトを入れたくない気持ち、伝われ!
初期設定
Python環境にMoviePyをインストールします。
pip install moviepy
コーディング
短いので全体をさらっと。
from moviepy.editor import *
from pathlib import Path
def main(input_file, output_file_stem):
# 読み込み
clip1 = VideoFileClip(input_file)
# 切り出し
top = 124
clip2 = clip1.crop(x1=0, y1=top, x2=320, y2=top+220)
# 保存
clip2.write_videofile(f"{output_file_stem}.mp4")
clip2.write_gif(f"{output_file_stem}.gif", fps=20)
if __name__=='__main__':
movie_file = Path('./data/mv1.mp4')
# 出力ファイルの拡張子手前まで
# ※ 複数の拡張子を変えていくつかのファイルを作りたいので、
# 拡張子手前までの文字列
out_file_stem = str(movie_file.parent / f"{movie_file.stem}_out")
main(str(movie_file), out_file_stem)
ほぼ説明するまでもないですね・・・。
まず、VideoFileClip()
で読み込みます。
次に、特定の矩形領域を切り出したかったので、読み込みの戻り値のインスタンスに対してcrop()
でそれ以外をカットしています。動画の位置サイズを小さくしています。
最後に、write_videofile()
でmp4を作ってみたけど、これは確認用。欲しかったのはwrite_gif()
でgifアニメの画像です。fps
でスピードを調整できます。(しないとかなり遅かった)
そのほか
他には、時間をカットする関数subclip()
は、使う場面がありそうです。
おわりに
何かの説明用の動画ならば、文字を入れるのも使うといいのかもしれないけど、タイミングや位置など、PythonのCUIでやることじゃねーなと思ったので止めました。
逆に、ブログか何かに載せるgifアニメだったら、Pythonでこれくらいの簡単さでできてちょうどいいなと思いました。
ちなみにプログラミングで画面を少しずつ構築したり機能UPしていくのを説明するときは、機能1を作ったときの動画、その後機能2を作ったときの動画、そして機能3を・・・となります。その場合の動画たちは、矩形領域はいつも同じなので、上で書いたようなスクリプトを作っておけば、何度も何度も使えると思います。少なくとも私は使います。
これこそ、面倒なことはプログラミングで解決するいい例だなと思いました。
私、こういう小粒な道具を作るのが得意です。ご相談、受け付けていますので、ホームページやXのDMなどでもご連絡ください😊
https://small-pieces.vercel.app/