最近朋友发给我一个抖音的视频问我程序能不能做,于是乎打开电脑先瞅瞅。
这模板居然要6块钱,而且音乐、片段都限制太死了。不好不好,然后这视频看了几遍花了2个晚上搞出来一套Python全程素材内容自动判断一键生成的模板。
我做这个的优点呢可以实现:
先来看看成品再看教程吧,点赞超过100奉上git源码地址。
横版百叶窗随机五彩切分
竖版百叶窗随机五彩切分
惯例导入一些需要的python支持库。
from moviepy.editor import *
import os
from PIL import Image
import glob
import librosa
import random
import re
import pandas as pd
import requests
from urllib import parse
from bs4 import BeautifulSoup
import time
from pychorus import find_and_output_chorus
import shutil
用于设置一些目录的文件夹,视频分辨率,每个视频百叶窗最大数量,自动截取音频高潮片段,还有图像边框之类的设置。
# 整体分辨率设置
full_screen = (1920,1080)
# 音乐路径
mp3_path = "mp3_data/"
# 图片保存地址
image_data = "image/"
# 图片列表路径
image_cut_list_path = "image_list/"
# 设置单张图片最大的画面切分数
image_cut_num = 10
# 音乐高潮自动截取时间s
high_second = 25
# 边框设置
mar = 10 # 外边框的宽度像素,mar指定了有效值,left、right、top、bottom设定不起作用
opacity = 0.5 # 边框透明度,0完全透明,1完全不透明
为了保证每次素材内容都不重复或者乱用,清空一下的好。
shutil.rmtree(image_data)
os.mkdir(image_data)
shutil.rmtree(image_cut_list_path)
os.mkdir(image_cut_list_path)
for infile in glob.glob(os.path.join(mp3_path, '*.wav')):
os.remove(infile)
chorus_start_sec = find_and_output_chorus(mp3_path + os.listdir(mp3_path)[0], mp3_path + "high.wav", 20)
# 读取音频文件
audio = AudioFileClip(mp3_path + "high.wav")
# 获取音乐节拍
x, sr = librosa.load(mp3_path + "high.wav")
# 构建节拍fram
onset_frames = librosa.onset.onset_detect(x, sr=sr)
# 转换音乐节拍切换成秒数
onset_times = librosa.frames_to_time(onset_frames)
# 将秒数时间保留两位小暑
onset_times = [round(i,2) for i in onset_times]
# onset_times
# 音乐节拍递归切分
def func(listTemp, n):<->
temp = func(onset_times,image_cut_num)
time_cut_list = [i for i in temp]
# 时间列表追加结束时间
time_cut_list[-1].append(audio.duration)
# time_cut_list
百度自己爬,实在不会自己复制黏贴吧。
html = requests.get(url, headers=headers)
html.encoding="utf8"
soup = BeautifulSoup(html.text, 'lxml')
reg = 'https://img2.(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+'
img_down_list = re.findall(reg, soup.find_all("script")[-1].text)
for jpg_url in img_down_list:
html = requests.get(jpg_url)
# print(jpg_url)
with open(image_data + str(int(time.time())) + ".jpg", 'wb') as file:
file.write(html.content)
time.sleep(0.1)
image_path = "image/"
image_dir_list=os.listdir(image_path)
# 设置图片时间轴2个,2用于覆盖1
image_dir_list_1 = image_dir_list[:len(time_cut_list)]
image_dir_list_2 = image_dir_list[1:len(time_cut_list)+1]
# 将所有图片统一尺寸为 full_screen
for i in image_dir_list_1+image_dir_list_2: <->
具体为什么使用全局动态变量设置方法自己想吧。
start_time = 0
n = 1 # 创建动态变量计数
image_clip_list = [] # 动态变量列表
for jpg,t in zip(image_dir_list_1,range(len(time_cut_list))):<->
cvc = concatenate_videoclips(image_clip_list)
# 将背景音乐合成到mp4中
audio = AudioFileClip('mp3_data/high.wav')
cvc = cvc.set_audio(audio)
cvc.write_videofile("base.mp4", fps=60)
all_box_list 为拆分后图片的像素点。
# 根据切分的时间计算窗口的大小
box_list = []
for i in range(image_cut_num):<->
# box_list
# 获取全部节拍点切分图片的box像素点
all_box_list = []
for n in range(len(time_cut_list)):<->
all_box_list
[[(0.0, 0, 192.0, 1080),
(192.0, 0, 384.0, 1080),
(384.0, 0, 576.0, 1080),
(576.0, 0, 768.0, 1080),
(768.0, 0, 960.0, 1080),
(960.0, 0, 1152.0, 1080),
(1152.0, 0, 1344.0, 1080),
(1344.0, 0, 1536.0, 1080),
(1536.0, 0, 1728.0, 1080),
(1728.0, 0, 1920.0, 1080)],
......]
data_dict = {}
data_list = []
for n in range(len(all_box_list)):<->
n = 1
# 将图片列表按照像素点切割
for image_name in image_dir_list_2:<->
# 照片排序顺序
image_cut_list_ = sorted(os.listdir(image_cut_list_path),key = lambda i:int(re.match(r'(\d+)',i).group()))
横板和竖版结果。
df = pd.DataFrame(data_list,columns=["pos","start","end"])
df["jpg"] = image_cut_list_
# df.head(8)
# 已经按照递归的方式打乱每张图的起始时间
temp = func(df["start"].to_list(),image_cut_num)
time_cut_list = [i for i in temp]
# 打乱每个组的时间顺序
for i in time_cut_list:
random.shuffle(i)
shffle_list = []
for i in time_cut_list:
for j in i:
shffle_list.append(j)
df["start"] = list(shffle_list)
数据的结果是这样的,看看能不能看懂。
# 全局变量计数使用
n = 1
image_clip_list = []
for i in range(len(df)):<->
video_base = VideoFileClip("base.mp4")
cvc = CompositeVideoClip([video_base]+image_clip_list)
cvc.write_videofile(str(int(time.time()))+".mp4",fps=30)
最终合成大概2分钟不到。
留言与评论(共有 0 条评论) “” |