抖音网红百叶窗短视频Python全程托管一键生成

最近朋友发给我一个抖音的视频问我程序能不能做,于是乎打开电脑先瞅瞅。

这模板居然要6块钱,而且音乐、片段都限制太死了。不好不好,然后这视频看了几遍花了2个晚上搞出来一套Python全程素材内容自动判断一键生成的模板。

我做这个的优点呢可以实现:

  1. 放入音乐通过算法自动提取音乐高潮片段,只需要设置需要的秒数即可。
  2. 可以自由设置百叶窗的方向及数量。
  3. 自由设置百叶窗的边框颜色以及显示效果。
  4. 不说有点小缺陷,就是图片素材需要自己找。
  5. 其他的就交给机器一键生成了。

先来看看成品再看教程吧,点赞超过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 条评论) “”
   
验证码:

相关文章

推荐文章