Avez-vous déjà vu une fée danser ? Utilisons python pour faire ensemble une petite vidéo de danse du code des fées

avant-propos

Récemment, j'ai vu une belle vidéo de danse féerique sur la station B. Je l'ai regardée des centaines de millions de fois en boucle, et je ne peux pas partir avant longtemps !

En regardant la vidéo disco de Miss Xianzi, que puis-je faire d'autre à part cliquer trois fois ? Sur un coup de tête, puis-je transformer la vidéo disco de la petite fée en code dance ?

Faites simplement ce que vous dites, et aujourd'hui je vais vous apprendre à transformer la vidéo de danse en une danse codée et à danser avec la fée sœur ~

Source vidéo : [Zi Yan] Avez-vous déjà vu une fée danser [Qianzhan]

Passez directement à la fin de l'article pour obtenir des avantages exclusifs pour les fans.

1. Conception des fonctions de base

En général, nous devons le diviser en les étapes suivantes :

  1. Téléchargez la vidéo de Miss Sister de la station B
  2. Capturez le GIF à partir de la vidéo et convertissez le GIF capturé en caractères ASCII
  3. Renommez et triez le gif de personnage converti en fonction de l'ordre de chaque image
  4. Convertir un gif de cadre trié en image
  5. Fusionner les images des personnages dans la vidéo
  6. vidéo ajouter une musique de fond

2. Étapes de mise en œuvre

1. Téléchargez la vidéo

Nous devons d'abord préparer, installer vous-obtenir pour télécharger des vidéos.

pip install you-get

insérez la description de l'image ici
Une fois l'installation terminée, téléchargez la vidéo localement via you-get.

Lien vidéo de la danse de la sœur féerique : https://www.bilibili.com/video/BV124411Q7iV

you-get -o 本地保存路径 视频链接 

insérez la description de l'image ici

De cette façon, nous avons réussi à télécharger la vidéo sur le local.
insérez la description de l'image ici

2. Intercepter le GIF et convertir en caractères ASCII

Ensuite, nous devons intercepter le GIF de la vidéo téléchargée. Il existe de nombreuses méthodes, qui peuvent également être implémentées avec python.

Étant donné que le GIF doit être converti en caractères ASCII ultérieurement, la longueur du GIF intercepté ne doit pas être trop longue, voici donc l'introduction de l'outil d'interception gif fourni avec le lecteur Thunder, et chaque interception dure 20 secondes.
insérez la description de l'image ici
Après avoir découpé chaque section, vous pouvez nommer le gif dans l'ordre 1 2 3.

insérez la description de l'image ici
insérez la description de l'image ici

Utilisez ASCII Animator pour convertir chaque image du GIF capturé en ASCII . Nous pouvons modifier la densité de caractères de la conversion en définissant le nombre de caractères par largeur de 100 pixels. Le type de sortie peut choisir l'animation ASCII (.gif)
insérez la description de l'image ici
Nous pouvons trouver le fichier temporaire sous le répertoire file, qui est le gif ASCII de chaque image convertie dans chaque gif stocké. Ensuite, nous devons traiter ces gifs ASCII et nous pouvons copier le dossier dans le projet python.

insérez la description de l'image ici

3. Renommer GIF

L'ancienne règle, dans un premier temps on importait toutes les bibliothèques que l'on utilisera plus tard.

import os
import re
import shutil
import cv2
from PIL import Image
import moviepy.editor as mpy

Tous les gifs ASCII convertis ont été obtenus.Afin de fusionner les images dans une vidéo plus tard, nous allons trier ces gifs.

Nous lisons d'abord à partir du dossier temporaire, filtrons tous les suffixes avec .gif , puis renommons ces gifs selon les règles de dénomination pour faciliter le tri ultérieur.

def rename_gif():
    file_list = os.listdir("./temp")  # 读取当前文件夹所有文件
    # print(file_list)
    print("检测到文件夹下图片:")
    n = len(file_list)
    num_list = []
    num1 = num2 = 0
    for i in range(n):
        s = str(file_list[i])
        if s[-4:] == ".gif":  # 检查后缀
            res = re.findall(r"\d+", s)
            if res[0] == '1':
                num1 += 1
            if res[0] == '2':
                num2 += 1
            src = os.path.join(os.path.abspath('./temp/'), s)  # 原先的图片名字
            dst = os.path.join(os.path.abspath('./temp/'), res[0] + '-' + res[1]+'.gif')  # 根据自己的需要重新命名
            os.rename(src, dst)  # 重命名,覆盖原先的名字
    num_list.append(num1)
    num_list.append(num2)
    file_list = os.listdir("./temp")  # 读取当前文件夹所有文件
    for i in range(n):
        s = str(file_list[i])
        if s[-4:] == ".gif":  # 检查后缀
            res = re.findall(r"\d+", s)
            src = os.path.join(os.path.abspath('./temp/'), s)  # 原先的图片名字
            a = int(res[0])-1
            index = a*num_list[a-1]
            dst = os.path.join(os.path.abspath('./temp/'), str(index + int(res[1])) + '.gif')  # 根据自己的需要重新命名
            os.rename(src, dst)  # 重命名,覆盖原先的名字

Une fois le gif renommé, tous les gifs ont été disposés dans l'ordre de chaque image. Lorsque nous synthétiserons la vidéo plus tard, nous n'aurons qu'à fusionner et ajouter en fonction du nom de l'image.
insérez la description de l'image ici

4. Convertir gif en jpg

Ensuite, nous voulons convertir les gifs disposés dans l'ordre des images en images jpg .

def gif2img(gif_path):
    gifs = os.listdir(gif_path)
    gifs.sort(key=lambda x: int(x[:-4]))  # 以名称字符串的数字从小到大排序
    for gif in gifs:
        im = Image.open(gif_path+gif)  # 打开gif格式的图片
        im = im.convert('RGB')
        if not os.path.exists('./img'):
            os.makedirs('./img')
        for i, frame in enumerate(iter_frames(im)):
            frame.save('./img/' + gif[0:-4] + '.jpg', **frame.info)  # 保存成jpg格式

insérez la description de l'image ici

5. Synthétiser la vidéo de danse du code

Vidéo de synthèse d'image, ici nous utilisons le module python-openvc pour réaliser, même si vous n'avez pas installé d'ami auparavant, vous devez d'abord l'installer.

pip install opencv-python

Nous pouvons passer le chemin du dossier d'images dans les paramètres, et nous pouvons également définir le nombre d'images par seconde par fps .

def charts2video(img_path, video_path):
    """将给定目录下的图片转成视频
    Args:
        img_path: 图片路径
        video_path: 输出视频的路径和名称

    Returns: 图片转成的视频
    """
    images = os.listdir(img_path)
    images.sort(key=lambda x: int(x[:-4]))  # 以名称字符串的数字从小到大排序  
    fps = 12  # 帧数
    fourcc = cv2.VideoWriter_fourcc('M', 'P', '4', 'V')
    im = Image.open(img_path + images[0])
    video_writer = cv2.VideoWriter(video_path, fourcc, fps, im.size)
    for img_i in images:
        frame = cv2.imread(img_path + img_i)
        print('开始将 ' + img_i + ' 加入视频\n')
        video_writer.write(frame)  # 注意:图片尺寸必须和视频尺寸一样,不然不会被加入视频中!!!
    video_writer.release()

insérez la description de l'image ici

6. Ajouter une musique de fond

Le code dance est terminé, la dernière étape consiste à ajouter la musique de fond de la vidéo au code dance. Nous utilisons le module moviepy pour capturer la musique de fond de la vidéo originale et l'enregistrer, et enfin insérer l'audio dans la vidéo de danse du code et l'enregistrer.

def add_music():
    # 读取代码视频
    my_clip = mpy.VideoFileClip('asc.mp4')
    # 截取背景音乐
    audio_background = mpy.AudioFileClip('dance.mp4').subclip(0, 60)
    audio_background.write_audiofile('bk.mp3')
    # 视频中插入音频
    final_clip = my_clip.set_audio(audio_background)
    # 保存最终视频
    final_clip.write_videofile('char_video.mp4')

Jusqu'à présent, la petite vidéo de danse des fées est convertie en danse codée et elle est complète ~

J'ai téléchargé la dernière vidéo de code dance sur la station B, tout le monde peut en profiter ensemble.

【Ziyan】Avez-vous déjà vu une fée danser ?

Dragon Junior | Texte

Le code source et les données ont été téléchargés, faites attention au compte public à la fin de l'article et répondez à [code source] pour obtenir le code source complet

Faits saillants passés de Python :

Je suppose que tu aimes

Origine blog.csdn.net/hhladminhhl/article/details/118463344
conseillé
Classement