素材のリスト化
globを使って指定したパス内のファイル名をリスト化する。
path = "C:\\Users\\~~~~\\Desktop\\sozai\\*"
file_list = glob.glob(path)
##sozaiフォルダの中にあるファイル全部を拡張子まで含めてリスト化
作ったリストのインデックス番号がランダムで指定されるようにして、
もっとごちゃごちゃな動画を作れるようにする。
sozai = VideoFileClip(file_list[random.randint(0,len(file_list))])
##リストのインデックスにランダムで数字を入れて素材をランダムに選ぶ
##本当はインデックスの範囲ミスっててこれだとエラーが出る。対処法は後述。
出くわしたエラー
①インデックスエラー
list index out of range
File "C:\Users\~~~~\Documents\Visual Studio 2022\Projects\AMV\~~~~.py", line 26, in <module>
sozai = VideoFileClip(file_list[random.randint(0,len(file_list)])
原因
上述のエラー。
リストのインデックス番号にない番号を参照しちゃってる。
本が5冊しか並んでない本棚に向かって「左から10冊目の本」を探してるみたいな状態。
呼び出すときの数字は1から数え始めるのに対して
リストの添え字は0から数え始めるので起きた。めっちゃ初歩的なやつ。
sozai = VideoFileClip(file_list[random.randint(0,len(file_list)])
##後ろに継ぎ足す素材をランダムで選ぶところ
素材フォルダに動画が10個入ってたとしたら、
リストの要素数”len(file_list)”は10になる。
だから
file_list[random.randint(0,len(file_list)]
この記述だと、リストのインデックスは0~10の範囲でランダムに選ばれる。
つまりリストの11番目までが範囲になっちゃってる。
解決策
ランダムで選ばれるインデックスの範囲を0~9(10個)にすればいいので
file_list[random.randint(0,len(file_list)-1]
##インデックス番号を0からファイル数-1にして個数と合うように修正
②グリッジ+音ズレ
原因
めっちゃ調べて同じようなグリッジで困ってる人の質問を見つけた。
解像度の異なる動画ファイルを繋げようとすると起こるっぽい。
動画の最初が「今日の5の2」で、そのあと「今日の5の2」と「ゆゆ式」くらいしか
ちゃんと見れる素材がない。どっちも16:9の720p。
一番最初にランダムで選ばれた動画と同じ解像度の素材は比較的キレイに処理されて、
あとは砂嵐っぽいグリッジが起きてる。
これはこれでかっこいいけどね。
解決策
動画のリサイズをして全部を同じ解像度にする。
moviepyのresizeメソッドで解像度を直接指定してリサイズができた。
##リストから動画素材をランダムに選んだあと
if(sozai.size != (1280,720)):
sozai = sozai.resize((1280,720))
今回は無理矢理1280:720にリサイズしたんだけど、
ちょい古い4:3のアニメ素材だとアス比が違うから
今後、縦のサイズを合わせて横は黒い帯で埋めるようにしてリサイズしたい。
補足
自分の環境だとresizeメソッドがインテリセンスが効かなかった。
記述方法を間違ってるからだろうって完全に思い込んでたせいでめっちゃ時間が無駄になったけど、
気にせず公式ドキュメントの通りの記述をすればOKだった。
参考になったページ
公式ドキュメントのresizeメソッド解説ページ
https://zulko.github.io/moviepy/ref/videofx/moviepy.video.fx.all.resize.html?highlight=resize#moviepy.video.fx.all.resize
終わりに
バグ取りしてるうちに「一旦リサイズする」みたいな””予防セクション””が
増えてきちゃったから定義化?関数化?をしたほうがよさそうだなって感じてきた。
次回は、
動画の長さを取得して、切り取り範囲(時間)を選ぶセクションで使えるようにする。