[PYTHON] Importez des vidéos de numéro de série avec Aviutl

introduction

Le but de cet article est d'importer automatiquement les vidéos avec les numéros de série créés à la suite de la découpe des vidéos à l'aide de l'article (https://qiita.com/merarli/items/1b7819adbae7fad3c9b4) dans Aviutl. Je vais. __ Par conséquent, il est supposé que les vidéos suivantes avec des numéros de série existent. フォルダ.PNG

Motivation pour la création

J'ai réussi à sauter automatiquement avec le grand leader __ (https://qiita.com/merarli/items/1b7819adbae7fad3c9b4/)__, mais la prochaine chose que j'attends est Aviutl Il s'agissait de faire glisser vers la chronologie étendue de. Si vous voulez profiter de la publication de vidéos et gagner de l'argent, il ne sert à rien d'automatiser le saut de coupure ... Eh bien, que faites-vous! !! Je l'ai créé avec le motif de.

résultat

Je mettrai le code créé plus tôt.


import glob#Obtenir la liste
import pathlib#Il semble que celui-ci similaire à glob soit plus pratique
import subprocess
from re import sub
from os import path#Connexion de chemin
import sys

m_path=r"D:\movie\JumpCut_note_DT"#Chemin vidéo
file_exo=open(path.join(m_path,"make_exo.exo"),mode='w')
#Importation de données vidéo pathlib
l_movie = pathlib.Path(m_path).glob(r'**\*.mp4')
movie_name=[]#Pour stocker les noms de fichiers
for p in l_movie:
    movie_name.append(p.name)#Ajouter des éléments
    print(p.name)
num= lambda val : int(sub('\\D','', val))#Extraire les numéros des noms de fichiers
movie_name=sorted(movie_name,key = num)#Trier
print(movie_name)


#Sortie de réglage initial Lire avec 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()#Stockage de liste séparé par des caractères de saut de ligne

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)#Fonction de calcul de chaîne de caractères 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)

#création exo
flame_all = []#Nombre d'images vidéo
n=0#Nombre de répétitions
s_flame=1#Cadre de début
e_flame=0#Cadre d'extrémité
#Données vidéo
for m_num in movie_name:
    n=movie_name.index(m_num)#Nombre de répétitions
    #[]Ordre des vidéos
    print('[',n,']',sep="",file=file_exo)#séparateur sép. espace demi-largeur par défaut
    #Début de la vidéo-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"))#La valeur de retour du sous-processus est byte?Alors convertissez-vous en utf8
    flame_all[n]=flame_all[n].rstrip('\r\n')#Supprimer le caractère de saut de ligne à la fin
    e_flame = int(flame_all[n])+int(e_flame)#Nombre actuel de flammes+Nombre d'images à la fin de la dernière fois
    print('start=',s_flame,sep="",file=file_exo)
    s_flame=int(e_flame)+1#Nombre d'images de départ suivantes=Nombre d'images à la fin de la dernière fois+1
    print('end=',e_flame,sep="",file=file_exo)
    print('layer=',1,sep="",file=file_exo)#Fichier vidéo 1,Fichier audio 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=Fichier vidéo',sep="",file=file_exo)#Créer un fichier audio pour un fichier audio
    print('Position de lecture=',1,sep="",file=file_exo)
    print('Vitesse de lecture=',100.0,sep="",file=file_exo)
    print('Lecture en boucle=',0,sep="",file=file_exo)
    print('Charger le canal alpha=',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=Dessin standard',sep="",file=file_exo)
    print('X=',0.0,sep="",file=file_exo)#Coordonnée X,Y,Z
    print('Y=',0.0,sep="",file=file_exo)
    print('Z=',0.0,sep="",file=file_exo)
    print('Taux d'expansion=',100.00,sep="",file=file_exo)
    print('Transparence=',0.0,sep="",file=file_exo)
    print('rotation=''{:.2f}'.format(0.00),sep="",file=file_exo)
    print('blend=',0,sep="",file=file_exo)
#Données vocales
s_flame=1#Cadre de début
e_flame=0#Cadre d'extrémité
for m_num in movie_name:
    n=movie_name.index(m_num)#Nombre de répétitions
    n_v=movie_name.index(m_num)+len(movie_name)#Nombre de répétitions de données séquentielles+movie_Nombre d'éléments dans le nom
    #[]Ordre des vidéos
    print('[',n_v,']',sep="",file=file_exo)#séparateur sép. espace demi-largeur par défaut
    #Début de la vidéo-Je n'ai pas besoin de finir ffmpeg parce que je l'ai fait dans la vidéo
    e_flame = int(flame_all[n])+int(e_flame)#Nombre actuel de flammes+Nombre d'images à la fin de la dernière fois
    print('start=',s_flame,sep="",file=file_exo)
    s_flame=int(e_flame)+1#Nombre d'images de départ suivantes=Nombre d'images à la fin de la dernière fois+1
    print('end=',e_flame,sep="",file=file_exo)
    print('layer=',2,sep="",file=file_exo)#Fichier audio 2
    print('group=',n+1,sep="",file=file_exo)#Reste n
    print('overlay=',1,sep="",file=file_exo)
    print('audio=',1,sep="",file=file_exo)#Caméra supprimée à la place, qui n'était pas dans la vidéo ici
    print('[''{:.1f}'']'.format(n_v),sep="",file=file_exo)
    print('_name=Fichier audio',sep="",file=file_exo)#Fichier audioではFichier audioにする
    print('Position de lecture=''{:.2f}'.format(0.00),sep="",file=file_exo)#C'était 1 dans la vidéo
    print('Vitesse de lecture=',100.0,sep="",file=file_exo)
    print('Lecture en boucle=',0,sep="",file=file_exo)
    print('Fonctionne avec les fichiers vidéo=',1,sep="",file=file_exo)
    if n==0 :#C'était comme ça dans 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=Lecture standard',sep="",file=file_exo)#動画では標準描画 音声 Lecture standard
    print('Le volume=',100.0,sep="",file=file_exo)
    print('Gauche et droite=',0.0,sep="",file=file_exo)

print(flame_all) 
file_exo.close()

Comment utiliser

Définissez le chemin où la vidéo est placée dans la variable (m_path). Après cela, si vous l'exécutez avec une invite de commande ou anaconda, un fichier de données d'édition (make_exo.exo) pour aviutl sera créé directement sous m_path. Si vous faites glisser make_exo.exo vers la chronologie étendue d'aviutl, les vidéos numérotées de série seront chargées dans la chronologie.

Description du fichier exo

L'explication du fichier exo des données d'exemple est décrite ci-dessous. Puisqu'il peut s'agir d'un numéro de série, créez un programme qui génère des informations selon les règles de ce fichier. Je ne peux pas confirmer chaque paramètre car je viens de le lire à partir du fichier exo.

[exedit]
width=908//Taille de la vidéo
height=512//
rate=30//fréquence d'images
scale=1
length=129//Cadre final global
audio_rate=44100
audio_ch=2
[0]//Début du fichier vidéo 0->1->2
start=1 //Cadre de départ
end=79 //Cadre d'extrémité
layer=1 
group=1
overlay=1 
camera=0
[0.0] //0.0->1.0->2.0
_name=Fichier vidéo
Position de lecture=1
Vitesse de lecture=100.0
Lecture en boucle=0
Charger le canal alpha=0
file=D:\movie\JumpCut_note_DT\0_out_.mp4
[0.1] //0.1->1.1->2.1
_name=Dessin standard
X=0.0
Y=0.0
Z=0.0
Taux d'expansion=100.00
Transparence=0.0
rotation=0.00
blend=0
[1]
start=80
end=100
layer=1
group=2
overlay=1
camera=0
[1.0]
_name=Fichier vidéo
Position de lecture=1
Vitesse de lecture=100.0
Lecture en boucle=0
Charger le canal alpha=0
file=D:\movie\JumpCut_note_DT\1_out_.mp4
[1.1]
_name=Dessin standard
X=0.0
Y=0.0
Z=0.0
Taux d'expansion=100.00
Transparence=0.0
rotation=0.00
blend=0
[2]//Démarrer le fichier audio
start=1
end=79
layer=2
group=1
overlay=1
audio=1
[2.0]
_name=Fichier audio
Position de lecture=0.00
Vitesse de lecture=100.0
Lecture en boucle=0
Fonctionne avec les fichiers vidéo=1
file=
[2.1]
_name=Lecture standard
Le volume=100.0
Gauche et droite=0.0
[3]
start=80
end=100
layer=2
group=2
overlay=1
audio=1
[3.0]
_name=Fichier audio
Position de lecture=0.00
Vitesse de lecture=100.0
Lecture en boucle=0
Fonctionne avec les fichiers vidéo=1
file=
[3.1]
_name=Lecture standard
Le volume=100.0
Gauche et droite=0.0

Cette explication du code

Je peux l'écrire à une date ultérieure. Il est généré dans un fichier texte dans l'ordre du fichier exo de base.

finalement

Ce programme a été créé par un amateur du programme juste pour le rendre plus facile. Par conséquent, je pense qu'il existe de nombreux cas où la manière d'écrire un programme n'est pas atteinte. Dans ce cas, je vous serais reconnaissant de bien vouloir me le faire savoir dans les commentaires. Bonne vie de publication vidéo! !!

Recommended Posts

Importez des vidéos de numéro de série avec Aviutl
Connectez un grand nombre de vidéos ensemble!
Grattage WEB avec BeautifulSoup4 (page du numéro de série)
Effacer et générer des fichiers de numéro de série avec un script shell
Communication série avec Python
Communication série avec python
Importer tsv avec Python
Créer une animation gif à partir d'un fichier de numéro de série avec matplotlib
[Python] Lecture facile des fichiers image du numéro de série avec OpenCV