##はじめに
この記事では,(https://qiita.com/merarli/items/1b7819adbae7fad3c9b4) の記事を用いて動画をjampcutした結果,__作成された連番の動画をAviutlに自動で取り込むことを目的としています.__そのため以下のような連番の動画が存在していることを前提としています.
##作成動機
偉大なる先陣__(https://qiita.com/merarli/items/1b7819adbae7fad3c9b4/)__ により自動でジャンプカットすることに成功した私であったが,次に待っているのは大量の動画をAviutlの拡張タイムラインにドラックすることだった.
せっかく楽して動画投稿して稼ぎたいと,ジャンプカットを自動化したのにこれでは意味がない・・・さて,どうする!!との動機で作成しました.
##結果
先に作成したコードを載せます.
import glob#リスト取得
import pathlib#globと似てるこっちのほうが便利らしい
import subprocess
from re import sub
from os import path#パス接続
import sys
m_path=r"D:\movie\JumpCut_note_DT"#動画パス
file_exo=open(path.join(m_path,"make_exo.exo"),mode='w')
#動画データ 取り込み pathlib
l_movie = pathlib.Path(m_path).glob(r'**\*.mp4')
movie_name=[]#ファイル名格納用
for p in l_movie:
movie_name.append(p.name)#要素追加していく
print(p.name)
num= lambda val : int(sub('\\D','', val))#ファイル名から数字抽出
movie_name=sorted(movie_name,key = num)#並び替え
print(movie_name)
#初期設定出力 ffmpegでよみとって
movie_size=subprocess.run(["ffprobe","-v","error","-select_streams","v:0","-show_entries","stream=width,height,r_frame_rate","-of","default=nokey=1:noprint_wrappers=1",path.join(m_path,movie_name[1])],stdout=subprocess.PIPE, stderr=subprocess.PIPE)
movie_size = movie_size.stdout.decode("utf8")
movie_size = movie_size.splitlines()#改行文字で区切ってlist 格納
print(movie_name[0])
print("movie_size\n"+ movie_size[0])
print(path.join(m_path,movie_name[0]))
print("[exedit]",file=file_exo)
print("width=",movie_size[0],sep="",file=file_exo)
print("hight=",movie_size[1],sep="",file=file_exo)
print("rate=",eval(movie_size[2]),sep="",file =file_exo)#文字列計算関数 eval
print("scale=",1,sep="",file =file_exo)
print("langh=",1,sep="",file=file_exo)
print("audio_rate=",44100,sep="",file=file_exo)
print("audio_ch=",2,sep="",file=file_exo)
#exo作成
flame_all = []#動画 フレーム数
n=0#繰り返し回数
s_flame=1#始まりのフレーム
e_flame=0#終わりのフレーム
#動画データ
for m_num in movie_name:
n=movie_name.index(m_num)#繰り返し回数
#[] 動画順番
print('[',n,']',sep="",file=file_exo)#sep 区切り文字 デフォ半角スペース
#動画start-end
flame =subprocess.run(["ffprobe","-v","error","-select_streams","v:0","-show_entries","stream=nb_frames","-of","default=nokey=1:noprint_wrappers=1",path.join(m_path,m_num)],stdout=subprocess.PIPE, stderr=subprocess.PIPE)
flame_all.append(flame.stdout.decode("utf8"))#subprocessの返り値はbyte?なのでutf8に変換
flame_all[n]=flame_all[n].rstrip('\r\n')#末尾に付く改行文字削除
e_flame = int(flame_all[n])+int(e_flame)#今のフレイム数+前回の終わりのフレーム数
print('start=',s_flame,sep="",file=file_exo)
s_flame=int(e_flame)+1#次回のスタートフレーム数=前回の終わりのフレーム数+1
print('end=',e_flame,sep="",file=file_exo)
print('layer=',1,sep="",file=file_exo)#映像ファイル1,音声ファイル2
print('group=',n+1,sep="",file=file_exo)
print('overlay=',1,sep="",file=file_exo)
print('camera=',0,sep="",file=file_exo)
print('[''{:.1f}'']'.format(n),sep="",file=file_exo)
print('_name=動画ファイル',sep="",file=file_exo)#音声ファイルでは音声ファイルにする
print('再生位置=',1,sep="",file=file_exo)
print('再生速度=',100.0,sep="",file=file_exo)
print('ループ再生=',0,sep="",file=file_exo)
print('アルファチャンネルを読み込む=',0,sep="",file=file_exo)
print('file=',path.join(m_path,m_num),sep="",file=file_exo)
print('[',n+0.1,']',sep="",file=file_exo)
print('_name=標準描画',sep="",file=file_exo)
print('X=',0.0,sep="",file=file_exo)#座標 X,Y,Z
print('Y=',0.0,sep="",file=file_exo)
print('Z=',0.0,sep="",file=file_exo)
print('拡大率=',100.00,sep="",file=file_exo)
print('透明度=',0.0,sep="",file=file_exo)
print('回転=''{:.2f}'.format(0.00),sep="",file=file_exo)
print('blend=',0,sep="",file=file_exo)
#音声データ
s_flame=1#始まりのフレーム
e_flame=0#終わりのフレーム
for m_num in movie_name:
n=movie_name.index(m_num)#繰り返し回数
n_v=movie_name.index(m_num)+len(movie_name)#順番データ繰り返し回数+movie_nameの要素数
#[] 動画順番
print('[',n_v,']',sep="",file=file_exo)#sep 区切り文字 デフォ半角スペース
#動画start-end ffmpegは動画でやったのでいらない
e_flame = int(flame_all[n])+int(e_flame)#今のフレイム数+前回の終わりのフレーム数
print('start=',s_flame,sep="",file=file_exo)
s_flame=int(e_flame)+1#次回のスタートフレーム数=前回の終わりのフレーム数+1
print('end=',e_flame,sep="",file=file_exo)
print('layer=',2,sep="",file=file_exo)#音声ファイル2
print('group=',n+1,sep="",file=file_exo)#nのまま
print('overlay=',1,sep="",file=file_exo)
print('audio=',1,sep="",file=file_exo)#ここ 動画にはなかった 代わりにcamera 削除
print('[''{:.1f}'']'.format(n_v),sep="",file=file_exo)
print('_name=音声ファイル',sep="",file=file_exo)#音声ファイルでは音声ファイルにする
print('再生位置=''{:.2f}'.format(0.00),sep="",file=file_exo)#動画では1だった
print('再生速度=',100.0,sep="",file=file_exo)
print('ループ再生=',0,sep="",file=file_exo)
print('動画ファイルと連携=',1,sep="",file=file_exo)
if n==0 :#sample1ではこうだった
print('file=',path.join(m_path,m_num),sep="",file=file_exo)
else:
print('file=',sep="",file=file_exo)
#print('file=',path.join(m_path,m_num),sep="",file=file_exo)
print('[',n_v+0.1,']',sep="",file=file_exo)#n->n_v
print('_name=標準再生',sep="",file=file_exo)#動画では標準描画 音声 標準再生
print('音量=',100.0,sep="",file=file_exo)
print('左右=',0.0,sep="",file=file_exo)
print(flame_all)
file_exo.close()
##使い方
変数(m_path)に動画が配置されているパスを設定してください.
その後,コマンドプロンプトなりanaconda なりで動かせば,m_path直下にaviutl用の編集データファイル(make_exo.exo)が作成されます.make_exo.exoをaviutl の拡張タイムラインにドラックすれば連番の動画がタイムラインに読み込まれると思います.
##exo ファイル解説
以下にサンプルデータのexoファイルの説明を記述します.連番になっていたり,するのでこのファイルの法則にしたがって情報を出力するプログラムを作成します.
各パラメータ共に,基本的にexoファイルからなんとなく読みとっただけなので確証は持てません.
[exedit]
width=908//動画サイズ
height=512//
rate=30//フレームレート
scale=1
length=129//全体の最終フレーム
audio_rate=44100
audio_ch=2
[0]//動画ファイル開始 0->1->2
start=1 //開始のフレーム
end=79 //終了のフレーム
layer=1
group=1
overlay=1
camera=0
[0.0] //0.0->1.0->2.0
_name=動画ファイル
再生位置=1
再生速度=100.0
ループ再生=0
アルファチャンネルを読み込む=0
file=D:\movie\JumpCut_note_DT\0_out_.mp4
[0.1] //0.1->1.1->2.1
_name=標準描画
X=0.0
Y=0.0
Z=0.0
拡大率=100.00
透明度=0.0
回転=0.00
blend=0
[1]
start=80
end=100
layer=1
group=2
overlay=1
camera=0
[1.0]
_name=動画ファイル
再生位置=1
再生速度=100.0
ループ再生=0
アルファチャンネルを読み込む=0
file=D:\movie\JumpCut_note_DT\1_out_.mp4
[1.1]
_name=標準描画
X=0.0
Y=0.0
Z=0.0
拡大率=100.00
透明度=0.0
回転=0.00
blend=0
[2]//音声ファイル開始
start=1
end=79
layer=2
group=1
overlay=1
audio=1
[2.0]
_name=音声ファイル
再生位置=0.00
再生速度=100.0
ループ再生=0
動画ファイルと連携=1
file=
[2.1]
_name=標準再生
音量=100.0
左右=0.0
[3]
start=80
end=100
layer=2
group=2
overlay=1
audio=1
[3.0]
_name=音声ファイル
再生位置=0.00
再生速度=100.0
ループ再生=0
動画ファイルと連携=1
file=
[3.1]
_name=標準再生
音量=100.0
左右=0.0
##本コード解説
後日記述するかもしれません.
基本exoファイルの順に沿ってテキストファイルに出力する形になっています.
##最後に
本プログラムはプログラムの素人が唯々,楽をしたくて作成したものになります.
したがって,プログラムの書き方など至らないとこ多々あると思います.その際はコメントなどで教えていただけると幸いです.
よい動画投稿ライフを!!