您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了“如何使用python做個(gè)代碼版的蹦迪視頻”,內(nèi)容簡(jiǎn)而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“如何使用python做個(gè)代碼版的蹦迪視頻”這篇文章吧。
總體來說,我們需要分為以下幾步完成:
從B站上把小姐姐的視頻下載下來
對(duì)視頻進(jìn)行截取GIF,把截取的GIF進(jìn)行ASCII字符轉(zhuǎn)換
把轉(zhuǎn)換的字符gif根據(jù)每一幀的順序重命名排序
將排序后的幀gif轉(zhuǎn)換為圖片
將字符圖片合并成視頻
視頻添加背景音樂
首先我們需要準(zhǔn)備工作,安裝you-get用來下載視頻。
pip install you-get
安裝完成后,通過you-get將視頻下載到本地。
仙女姐姐蹦迪視頻鏈接:https://www.bilibili.com/video/BV124411Q7iV
you-get -o 本地保存路徑 視頻鏈接
這樣我們就把視頻成功下載到本地了。
接下來我們要將下載的視頻進(jìn)行GIF截取,方法也比較多,用python也可以實(shí)現(xiàn)。
因?yàn)楹竺嫘枰袵IF轉(zhuǎn)成ASCII字符,截取的GIF時(shí)長盡量不能太長,所以這里就介紹通過迅雷播放器自帶的gif截取工具,每次截取20s。
將每段截取出來之后, 可以按照順序1 2 3將gif命名。
使用ASCII Animator將截取的GIF每一幀轉(zhuǎn)換成ASCII。我們可以通過設(shè)置每100個(gè)像素寬度的字符數(shù)修改轉(zhuǎn)換的字符密集程度。輸出類型可以選擇動(dòng)畫ASCII(.gif)
我們可以在目錄文件下找到temp文件,里面就是存儲(chǔ)的每個(gè)gif中每一幀轉(zhuǎn)換的ASCII的gif。下面我們就是需要處理這些ASCII的gif,可以將文件夾拷貝到python項(xiàng)目下面。
老規(guī)矩,最開始我們把后面要用到的庫全部導(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)拿到了,為了后面我們將圖片合并成視頻,接下來我們就要把這些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 = 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') # 根據(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])-1 index = 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ù)圖片的名稱來進(jìn)行合并添加就可以了。
接下來,我們要把按幀順序排列的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) # 打開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格式
圖片合成視頻,這里我們使用python-openvc模塊實(shí)現(xiàn),同樣如果之前沒有安裝的小伙伴,需要先安裝下。
pip install opencv-python
我們可以將圖片文件夾的路徑傳入?yún)?shù),還可以通過fps設(shè)置每秒多少張圖片。
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('開始將 ' + img_i + ' 加入視頻\n') video_writer.write(frame) # 注意:圖片尺寸必須和視頻尺寸一樣,不然不會(huì)被加入視頻中!?。? video_writer.release()
代碼舞已經(jīng)完成了,最后一步就是把視頻中的背景音樂添加到代碼舞中。我們使用的是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')
以上是“如何使用python做個(gè)代碼版的蹦迪視頻”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。