目錄
- 前言
- 一、核心功能設計
- 二、實現步驟
- 1. 下載視頻
- 2. 截取GIF并轉換成ASCII字符
- 3. GIF重命名
- 4. gif轉換為圖片jpg
- 5. 合成代碼舞視頻
- 6. 添加背景音樂
前言
最近在B站上看到一個漂亮的仙女姐姐跳舞視頻,循環看了億遍又億遍,久久不能離開!
看著仙紫小姐姐的蹦迪視頻,除了一鍵三連還能做什么?突發奇想,能不能把小仙女的蹦迪視頻轉成代碼舞呢?
說干就干,今天就手把手教大家如何把跳舞視頻轉成代碼舞,跟著仙女姐姐一起蹦起來~
視頻來源:【紫顏】見過仙女蹦迪嗎 【千盞】
一、核心功能設計
總體來說,我們需要分為以下幾步完成:
從B站上把小姐姐的視頻下載下來
對視頻進行截取GIF,把截取的GIF進行ASCII字符轉換
把轉換的字符gif根據每一幀的順序重命名排序
將排序后的幀gif轉換為圖片
將字符圖片合并成視頻
視頻添加背景音樂
二、實現步驟
1. 下載視頻
首先我們需要準備工作,安裝you-get用來下載視頻。

安裝完成后,通過you-get將視頻下載到本地。
仙女姐姐蹦迪視頻鏈接:https://www.bilibili.com/video/BV124411Q7iV

這樣我們就把視頻成功下載到本地了。

2. 截取GIF并轉換成ASCII字符
接下來我們要將下載的視頻進行GIF截取,方法也比較多,用python也可以實現。
因為后面需要把GIF轉成ASCII字符,截取的GIF時長盡量不能太長,所以這里就介紹通過迅雷播放器自帶的gif截取工具,每次截取20s。

將每段截取出來之后, 可以按照順序1 2 3將gif命名。


使用ASCII Animator將截取的GIF每一幀轉換成ASCII。我們可以通過設置每100個像素寬度的字符數修改轉換的字符密集程度。輸出類型可以選擇動畫ASCII(.gif)

我們可以在目錄文件下找到temp文件,里面就是存儲的每個gif中每一幀轉換的ASCII的gif。下面我們就是需要處理這些ASCII的gif,可以將文件夾拷貝到python項目下面。

3. GIF重命名
老規矩,最開始我們把后面要用到的庫全部導入。
import os
import re
import shutil
import cv2
from PIL import Image
import moviepy.editor as mpy
所有轉換成功的ASCII的gif已經拿到了,為了后面我們將圖片合并成視頻,接下來我們就要把這些gif進行排序。
我們先從temp文件夾中讀取,篩選出所有后綴名是 .gif 的,然后根據命名規則,將這些gif重命名,方便后面排序。
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) # 重命名,覆蓋原先的名字
gif重命名之后,所有的gif都已經按照每一幀的順序排好了。后面我們合成視頻的時候,只要根據圖片的名稱來進行合并添加就可以了。

4. gif轉換為圖片jpg
接下來,我們要把按幀順序排列的gif轉換成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格式

5. 合成代碼舞視頻
圖片合成視頻,這里我們使用python-openvc模塊實現,同樣如果之前沒有安裝的小伙伴,需要先安裝下。
pip install opencv-python
我們可以將圖片文件夾的路徑傳入參數,還可以通過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()

6. 添加背景音樂
代碼舞已經完成了,最后一步就是把視頻中的背景音樂添加到代碼舞中。我們使用的是moviepy 模塊,截取原視頻的背景音樂并保存,最后再將代碼舞視頻中插入音頻保存。
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')
至此,小仙女跳舞視頻轉成代碼舞就完成啦~
最后的代碼舞視頻我已經上傳到B站了,大家可以一起來欣賞下喔。
【紫顏】見過仙女蹦迪代碼舞嗎?
今天我們就到這里,明天繼續努力!

如果本篇博客有任何錯誤,請批評指教,不勝感激 !
到此這篇關于用python做個代碼版的小仙女蹦迪視頻的文章就介紹到這了,更多相關python代碼視頻內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持腳本之家!
您可能感興趣的文章:- 用python制作詞云視頻詳解
- 用Python做一個嗶站小姐姐詞云跳舞視頻
- Python做個自定義動態壁紙還可以放視頻
- Python編程實現小姐姐跳舞并生成詞云視頻示例