见过仙女蹦迪吗?一起用python做个小仙女代码蹦迪视频
前言
最近在B站上看到一個(gè)漂亮的仙女姐姐跳舞視頻,循環(huán)看了億遍又億遍,久久不能離開(kāi)!
看著仙紫小姐姐的蹦迪視頻,除了一鍵三連還能做什么?突發(fā)奇想,能不能把小仙女的蹦迪視頻轉(zhuǎn)成代碼舞呢?
說(shuō)干就干,今天就手把手教大家如何把跳舞視頻轉(zhuǎn)成代碼舞,跟著仙女姐姐一起蹦起來(lái)~
視頻來(lái)源:【紫顏】見(jiàn)過(guò)仙女蹦迪嗎 【千盞】
直接跳到文末獲取粉絲專屬福利。
一、核心功能設(shè)計(jì)
總體來(lái)說(shuō),我們需要分為以下幾步完成:
二、實(shí)現(xiàn)步驟
1. 下載視頻
首先我們需要準(zhǔn)備工作,安裝you-get用來(lái)下載視頻。
pip install you-get
安裝完成后,通過(guò)you-get將視頻下載到本地。
仙女姐姐蹦迪視頻鏈接:https://www.bilibili.com/video/BV124411Q7iV
you-get -o 本地保存路徑 視頻鏈接這樣我們就把視頻成功下載到本地了。
2. 截取GIF并轉(zhuǎn)換成ASCII字符
接下來(lái)我們要將下載的視頻進(jìn)行GIF截取,方法也比較多,用python也可以實(shí)現(xiàn)。
因?yàn)楹竺嫘枰袵IF轉(zhuǎn)成ASCII字符,截取的GIF時(shí)長(zhǎng)盡量不能太長(zhǎng),所以這里就介紹通過(guò)迅雷播放器自帶的gif截取工具,每次截取20s。
將每段截取出來(lái)之后, 可以按照順序1 2 3將gif命名。
使用ASCII Animator將截取的GIF每一幀轉(zhuǎn)換成ASCII。我們可以通過(guò)設(shè)置每100個(gè)像素寬度的字符數(shù)修改轉(zhuǎn)換的字符密集程度。輸出類型可以選擇動(dòng)畫(huà)ASCII(.gif)
我們可以在目錄文件下找到temp文件,里面就是存儲(chǔ)的每個(gè)gif中每一幀轉(zhuǎn)換的ASCII的gif。下面我們就是需要處理這些ASCII的gif,可以將文件夾拷貝到python項(xiàng)目下面。
3. GIF重命名
老規(guī)矩,最開(kāi)始我們把后面要用到的庫(kù)全部導(dǎo)入。
import os import re import shutil import cv2 from PIL import Image import moviepy.editor as mpy所有轉(zhuǎn)換成功的ASCII的gif已經(jīng)拿到了,為了后面我們將圖片合并成視頻,接下來(lái)我們就要把這些gif進(jìn)行排序。
我們先從temp文件夾中讀取,篩選出所有后綴名是 .gif 的,然后根據(jù)命名規(guī)則,將這些gif重命名,方便后面排序。
def rename_gif():file_list = os.listdir("./temp") # 讀取當(dāng)前文件夾所有文件# print(file_list)print("檢測(cè)到文件夾下圖片:")n = len(file_list)num_list = []num1 = num2 = 0for i in range(n):s = str(file_list[i])if s[-4:] == ".gif": # 檢查后綴res = re.findall(r"\d+", s)if res[0] == '1':num1 += 1if res[0] == '2':num2 += 1src = os.path.join(os.path.abspath('./temp/'), s) # 原先的圖片名字dst = os.path.join(os.path.abspath('./temp/'), res[0] + '-' + res[1]+'.gif') # 根據(jù)自己的需要重新命名os.rename(src, dst) # 重命名,覆蓋原先的名字num_list.append(num1)num_list.append(num2)file_list = os.listdir("./temp") # 讀取當(dāng)前文件夾所有文件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])-1index = a*num_list[a-1]dst = os.path.join(os.path.abspath('./temp/'), str(index + int(res[1])) + '.gif') # 根據(jù)自己的需要重新命名os.rename(src, dst) # 重命名,覆蓋原先的名字gif重命名之后,所有的gif都已經(jīng)按照每一幀的順序排好了。后面我們合成視頻的時(shí)候,只要根據(jù)圖片的名稱來(lái)進(jìn)行合并添加就可以了。
4. gif轉(zhuǎn)換為圖片jpg
接下來(lái),我們要把按幀順序排列的gif轉(zhuǎn)換成jpg圖片。
def gif2img(gif_path):gifs = os.listdir(gif_path)gifs.sort(key=lambda x: int(x[:-4])) # 以名稱字符串的數(shù)字從小到大排序for gif in gifs:im = Image.open(gif_path+gif) # 打開(kāi)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模塊實(shí)現(xiàn),同樣如果之前沒(méi)有安裝的小伙伴,需要先安裝下。
pip install opencv-python我們可以將圖片文件夾的路徑傳入?yún)?shù),還可以通過(guò)fps設(shè)置每秒多少?gòu)垐D片。
def charts2video(img_path, video_path):"""將給定目錄下的圖片轉(zhuǎn)成視頻Args:img_path: 圖片路徑video_path: 輸出視頻的路徑和名稱Returns: 圖片轉(zhuǎn)成的視頻"""images = os.listdir(img_path)images.sort(key=lambda x: int(x[:-4])) # 以名稱字符串的數(shù)字從小到大排序 fps = 12 # 幀數(shù)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('開(kāi)始將 ' + img_i + ' 加入視頻\n')video_writer.write(frame) # 注意:圖片尺寸必須和視頻尺寸一樣,不然不會(huì)被加入視頻中!!!video_writer.release()6. 添加背景音樂(lè)
代碼舞已經(jīng)完成了,最后一步就是把視頻中的背景音樂(lè)添加到代碼舞中。我們使用的是moviepy 模塊,截取原視頻的背景音樂(lè)并保存,最后再將代碼舞視頻中插入音頻保存。
def add_music():# 讀取代碼視頻my_clip = mpy.VideoFileClip('asc.mp4')# 截取背景音樂(lè)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')至此,小仙女跳舞視頻轉(zhuǎn)成代碼舞就完成啦~
最后的代碼舞視頻我已經(jīng)上傳到B站了,大家可以一起來(lái)欣賞下喔。
【紫顏】見(jiàn)過(guò)仙女蹦迪代碼舞嗎?
Dragon少年 | 文
源碼及數(shù)據(jù)已上傳,關(guān)注文末公眾號(hào)回復(fù)【源碼】即可獲取完整源碼
Python往期精彩:
-
見(jiàn)過(guò)仙女蹦迪嗎?一起用python做個(gè)小仙女代碼蹦迪視頻
-
python自制一款炫酷音樂(lè)播放器,想聽(tīng)啥隨便搜!
-
斗地主老是輸?一起用Python做個(gè)AI出牌器,豆子蹭蹭漲!
-
桌面太單調(diào)?一起用Python做個(gè)自定義動(dòng)畫(huà)掛件,好玩又有趣!
-
一起用Python做個(gè)車牌自動(dòng)識(shí)別系統(tǒng),好玩又實(shí)用!
-
桌面太單調(diào)?一起用Python做個(gè)自定義動(dòng)態(tài)壁紙,竟然還可以放視頻!
-
一起用Python做個(gè)自動(dòng)化彈鋼琴腳本,我竟然彈出了《天空之城》!
往期精彩源碼均可通過(guò)下方公眾號(hào)獲取
總結(jié)
以上是生活随笔為你收集整理的见过仙女蹦迪吗?一起用python做个小仙女代码蹦迪视频的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 我笨,但我不傻
- 下一篇: SQL中binary 和 varbina