関数化する目的
機能を細かく関数化して、main.pyをスッキリさせることで、
可読性をよくして、メンテナンスのときに自分でわからなくならないようにするため。
関数を定義する
疑問点・不安
プログラミングが本職でもなければ情報系の学校に通っていたわけでもないので、
上から下にダラダラ書いていくやり方しか知らない。
直感的にわからなかったのは下記の通り
- 関数定義の記述方法
- 機能をどこまで細かく分けて関数にするべきなのか
- 関数は別のソースファイルに書くべきなのか
- VScodは別のソースファイルの関数を呼び出せるのか
- Moviepyで扱う動画オブジェクトが引数として受け渡しできるのか
1は調べればすぐ解決したし、
2は各々の匙加減だったし、
3はどっちでもよかったし、
4と5は普通にできた。
実際に記述したコード
Moviepyの記述方法に関する日本語のページはあんまりないし、
似たようなことしようとしてる人のために関数を定義したuserdefine.pyを
ほぼそのまんま載せておきます。
稚拙なコードだけど少しでも参考になれば。
from moviepy.editor import *
import random
import glob
#素材をリスト化
def file_load(path):
file_list = glob.glob(path)
print(file_list)
return file_list
#ちっちゃい動画が100個以上必要だったらA
def mode_judge(loops):
if loops > 100:
mode = "A"
else:
mode = "B"
return mode
#リストから動画ファイルをランダムに選択
def choose_file(file_list):
sozai = VideoFileClip(file_list[random.randint(0,len(file_list)-1)])
return sozai
#選んだ動画ファイルの再生時間を取得
def get_duration(sozai):
file_length = sozai.duration
return file_length
#解像度が違う動画を繋げるとバグるからリサイズして統一
def resize(sozai):
if(sozai.size != (1280,720)):
resized_sozai = sozai.resize((1280,720))
return resized_sozai
#切り取る始点をランダムで決める
def tstart_random(section_endtime):
tstart = random.randint(0,section_endtime)
return tstart
#div1に短い動画を格納
def cutting_video(resized_sozai,tstart,tend):
div1 = resized_sozai.subclip(tstart,tend)
return div1
#div1の後ろに、切り取ったちっちゃい動画div2を繋げる
def adding_video(div1,div2):
div1 = concatenate_videoclips([div1,div2])
return div1
#ちっちゃい動画を100個繋げたら書き出す
def export(div1,export_path,video_num):
div1.write_videofile(export_path+"part"+str(video_num)+".mp4",codec='libx264',audio_codec='aac',temp_audiofile='temp-audio.m4a',remove_temp=True)
return 0
#書き出した動画たちを繋げて1個にする
def finish(parts_path,export_path):
file_list = file_load(parts_path)
file_quantity = len(file_list)
print(file_list)
div1 = VideoFileClip(file_list[0])
for loop_times in range(file_quantity-1):
div2 = VideoFileClip(file_list[loop_times+1])
div1 = adding_video(div1,div2)
loop_times +=1
div1.write_videofile(export_path+"result.mp4",codec='libx264',audio_codec='aac',temp_audiofile='temp-audio.m4a',remove_temp=True)
return 0
#ちっちゃい動画が100個も必要ないときの書き出し
def short_export(div1,export_path):
div1.write_videofile(export_path+"result.mp4",codec='libx264',audio_codec='aac',temp_audiofile='temp-audio.m4a',remove_temp=True)
return 0
遭遇したエラー
実装済みの機能を引数と型に気を付けながら関数に置き換えるだけの作業だったから
Moviepy特有っぽいエラーはなかった。
終わりに
次回はGUIを作るか、これを一旦完成として別の創作物に手を付けるか。
迷う。