一起用Python做个自动化短视频生成脚本,实现热门视频流水线生产!

前言

前几天有粉丝和我说,最近在网上看到一些视频营销号一天能发布几百条短视频, 感觉都是批量生成的,能不能用Python做个自动化短视频生成脚本呢?

今天就带大家一起用Python做个自动化视频生成脚本,实现热门视频批量流水线生产,一起来看看吧~

直接跳到文末获取源码福利。

一、核心功能设计

首先我看了网上那些视频营销号的视频,大多数都是围绕一个主题通过几张图片进行视频轮播展示并添加一些热门歌曲作为背景音乐。

知道了大概的思路,接下来我们可以通过以下几步进行实现:

  • 通过关键字进行图片批量爬取
  • 对爬取的图片进行筛选并批量进行大小resize统一
  • 将统一大小的图片进行视频合成
  • 根据选取的歌曲,截取合适的背景音乐
  • 将视频和截取的背景音乐合并

二、实现步骤

1. 图片爬取

当然如果小伙伴已经有视频素材了,只想给视频直接添加背景可以直接跳到第四步;如果已经有图片素材不需要爬取了,可以直接跳到第二步。

第一步,我们可以根据需要的视频主题进行关键字图片搜索,对图片进行批量爬取。例如我们以日本动漫《你的名字》作为主题,通过输入关键字,爬取动漫相关的图片。核心代码如下:

def dowmloadimg(html, keyword, startNum):
    headers = {'user-agent': 'Mozilla/5.0'}  # 请求头
    pic_url = re.findall('"objURL":"(.*?)",', html, re.S)  # 找到符合正则规则的网址
    num = len(pic_url)
    i = startNum
    subroot = root
    txtpath = subroot + '/download_img.txt'
    print('找到关键词:' + keyword + '的图片,开始下载图片...')
    for each in pic_url:
        a = '第' + str(i + 1) + '张图片,图片地址:' + str(each) + '\n'
        b = '正在下载' + a
        print(b)
        path = subroot + '/' + str(i + 1)
        try:
            if not os.path.exists(subroot):
                os.makedirs(subroot)
            if not os.path.exists(path):
                pic = requests.get(each, headers=headers, timeout=10)
                with open(path + '.jpg', 'wb') as f:
                    f.write(pic.content)
                    f.close()
                with open(txtpath, 'a') as f:
                    f.write(a)
                    f.close()
        except:
            traceback.print_exc()
            print('ERROR!!!当前图片无法下载!!!')
            continue
        i += 1
    return i
words = input("请输入关键字: ")
root = './' + words
if not os.path.exists(root):
    os.makedirs(root)

# 参数为需爬取的页数
for i in range(2):
    url = 'http://image.baidu.com/search/flip?tn=baiduimage&ie=utf-8&word=' + words + "&pn=" + str(
        pageId) + "&gsm=?&ct=&ic=0&lm=-1&width=0&height=0"
    pageId += 20
    html = requests.get(url, headers=headers)
    lastNum = dowmloadimg(html.text, words, lastNum, )  # 执行一次获取60张图

至此我们就可以根据关键字将图片爬取下来,并将图片根据数字顺序命名,如下图所示。

在这里插入图片描述

2. 图片统一格式大小

第二步,我们需要将获取的图片进行大小格式统一,方便后面的视频合成。这里我们可以自己手动筛选部分需要resize统一大小的图片,也可以对爬取的整个文件夹下图片批量统一格式大小。对于图片大小尺寸可以通过代码进行设置,这里我们将所有图片大小统一成600*800的。核心代码如下:

# 将所有图像resize成600*800,并保存
def resize_image(image_name):
    # 获取输入文件夹中的所有文件
    files = os.listdir('./' + image_name)
    output_dir = './resize/'
    # 判断输出文件夹是否存在,不存在则创建
    if not os.path.exists(output_dir):
        os.makedirs(output_dir)
    for file in files:
        if file[-4:] == ".jpg":
            img = Image.open('./' + image_name + '/' + file)
            # 将所有图片均转成RGB,防止图片格式异常
            img = img.convert('RGB')
            # resize图片大小设置成600*800
            img = img.resize((600, 800), Image.ANTIALIAS)
            img.save(os.path.join(output_dir, file))

在这里插入图片描述

3. 视频合成

第三步,我们可以将这些格式大小统一的图片进行视频合成,这里我们可以把整个文件夹中的图片全部合成,也可以自己手动选取部分。合成的时候我们根据图片的数字命名顺序进行一次合并,核心代码如下:

def charts2video(img_path, video_path):
    """将给定目录下的图片转成视频
        img_path: 图片路径
        video_path: 输出视频的路径名称
    返回: 图片转成的视频
    """
    images = os.listdir(img_path)
    images.sort(key=lambda x: int(x[:-4]))  # 以名称字符串的数字从小到大排序  
    fps = 1.5  # 帧数
    fourcc = cv2.VideoWriter_fourcc('D', 'I', 'V', 'X')
    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()

这里如果我们要控制视频每秒钟播放的图片张数,可以根据fps代表的每一秒播放多少张图片对帧数自行设置,从而完成图片的视频合成。

4. 截取背景音乐

第四步,在背景音乐截取前,我们首先需要确认视频时长,这样我们才能截取适时的背景音乐。所以我们可以先获取视频的长度,返回的就是以s为单位的视频时长,核心代码如下:

def get_video_time(filename):
  cap = cv2.VideoCapture(filename)
  if cap.isOpened():
    rate = cap.get(5)
    frame_num =cap.get(7)
    duration = frame_num/rate
    return duration
  return -1
t = get_video_duration('./你的名字.mp4')

视频时长知道了,接下来我们就要进行背景音乐截取了,之前博主有写过一篇文章,关于如何用Python自制一款炫酷音乐播放器,感兴趣的可以去看看是如何制作的。音乐播放器博主已开放源码,可通过文末公众号获取

今天我们就使用这款自制的音乐播放器来下载我们需要的音乐。例如我们就以《错位时空》作为背景音乐,我们可以先通过这款音乐播放器将这首歌下载到本地。如下图所示。
在这里插入图片描述
音乐下载完毕,接下来就是音乐截取,这里我们提供了两种方式。一种是截取歌曲高潮部分,另一种是自己选取歌曲截取区间

歌曲高潮自动截取:
经常刷短视频的小伙伴,可以看到网上很多短视频背景音乐都是歌曲的高潮部分。那么Python能否自动获取歌曲的高潮部分呢?当然!Python已经考虑到了,可以自动截取歌曲高潮部分,这里我们需要用到pychorus模块,具体这个是如何实现,大家可以网上查资料研究研究。

首先我们需要安装下pychorus模块

pip install pychorus

安装完成后,导入pychorus模块,一行代码调用就可以实现,这里传入的参数t就是上面我们获取的视频时长,这样可以确保截取的背景音乐和视频时长一致,方便视频和音乐合成。

同时我们还需要注意下,一般一首歌曲的时长大概3-4分钟,所以我们传入的t最好不要超过1分钟,否则可能会出现高潮截取失败。核心代码如下:

from pychorus import find_and_output_chorus
chorus_start_sec = find_and_output_chorus("./错位时空 - 艾辰.mp3", "./错位时空_high.wav", t)

如下图,我们知道了视频的时长是26s,然后截取背景音乐,自动获取的高潮部分是从2分32秒开始,时长26s。至此我们就可以把当前歌曲的高潮部分截取出来进行最后的视频和音乐合并了。
在这里插入图片描述

自定义截取歌曲区间:

如果本身我们的视频长度较长,截取不到歌曲高潮部分怎么办呢?我们可以进行自己定义歌曲截取区间来获取背景音乐,下面就演示下,截取歌曲从20s开始到90s结束,核心代码如下:

# 截取背景音乐
audio_background = mpy.AudioFileClip('./错位时空 - 艾辰.mp3').subclip(20, 90)
audio_background.write_audiofile('bk.mp3')

在这里插入图片描述

5. 视频和背景音乐合并

第五步,我们需要把视频和刚刚截取好的背景音乐进行合并,合成一个新的视频,核心代码如下:

def add_music():
    # 读取代码视频
    my_clip = mpy.VideoFileClip('你的名字.mp4')
    # 截取背景音乐
    audio_background = mpy.AudioFileClip('错位时空_high.wav')
    # 视频中插入音频
    final_clip = my_clip.set_audio(audio_background)
    # 保存最终视频
    final_clip.write_videofile('result.mp4')

至此,整个视频就可以自动生成,实现热门视频流水线生产了!下面我们一起运行下看看自动生成的视频效果如何吧。

源码及数据已上传,关注文末公众号回复【短视频源码】即可获取完整源码

Python往期精彩:

### 回答1: 你好,我是 C 知道。关于你的问题,我可以回答。你可以使用 Python 的 OpenCV 库来自动化视频处理,使用 PyDub 库来处理音频。你可以使用 OpenCV 的 VideoCapture 和 VideoWriter 类来读取和写入视频。使用 PyDub 的 AudioSegment 类来处理音频。你可以使用 Google Cloud Text-to-Speech API 将文本转换为语音,并将其插入到视频。希望这可以帮助你。 ### 回答2: 要编写一个自动化生成视频并插入语音的Python脚本,可以使用MoviePy库实现这一功能。下面是一个简单的示例脚本: ```python from moviepy.editor import * def generate_video_with_audio(video_path, audio_path, output_path): # 读取视频和音频文件 video = VideoFileClip(video_path) audio = AudioFileClip(audio_path) # 提取视频的音频部分,长度与音频文件相同 video_audio = video.audio.subclip(0, audio.duration) # 将音频与视频合并 video_with_audio = video.set_audio(audio) # 输出最终的视频文件 video_with_audio.write_videofile(output_path) # 释放内存 video.audio.reader.close_proc() audio.reader.close_proc() if __name__ == "__main__": video_path = "input_video.mp4" audio_path = "input_audio.mp4" output_path = "output_video.mp4" generate_video_with_audio(video_path, audio_path, output_path) ``` 在这个示例,我们首先导入`moviepy.editor`库,然后定义了一个`generate_video_with_audio`函数用于生成带有语音的视频。该函数使用`VideoFileClip`和`AudioFileClip`分别读取视频和音频文件。 然后,我们从视频文件提取出与音频文件长度相同的音频部分,并使用`set_audio`将音频插入到视频。 最后,我们使用`write_videofile`将最终的视频文件输出到指定的路径,并释放内存。 在`if __name__ == "__main__":`部分,我们指定了输入视频文件路径`video_path`、输入音频文件路径`audio_path`和输出视频文件路径`output_path`,并调用了`generate_video_with_audio`函数来生成带有语音的视频。 当然,上述只是一个简单的示例脚本,你可以根据自己的需求进行修改和扩展。 ### 回答3: 编写一个自动做视频并插入语音的Python脚本是可行的。下面是一个简单的脚本示例: ```python import os import cv2 import numpy as np from moviepy.editor import ImageSequenceClip from moviepy.editor import concatenate_videoclips from moviepy.editor import TextClip from moviepy.editor import AudioFileClip def create_video_with_voice(images_folder, audio_file_path, output_file_path): images = [] # 读取文件夹的所有图片 for filename in sorted(os.listdir(images_folder)): if filename.endswith(".jpg") or filename.endswith(".jpeg") or filename.endswith(".png"): filepath = os.path.join(images_folder, filename) image = cv2.imread(filepath) images.append(image) clips = [] for image in images: # 把图片转换为视频帧 clip = ImageSequenceClip([image], durations=[5]) clips.append(clip) # 拼接所有视频帧 video = concatenate_videoclips(clips) # 插入语音 audio = AudioFileClip(audio_file_path) video = video.set_audio(audio) # 添加文字 text = TextClip("自动生成视频", fontsize=50, color='white').set_position('center').set_duration(video.duration) video = video.set_audio(audio) # 保存视频 video.write_videofile(output_file_path, codec='libx264') # 示例用法 images_folder = 'images/' # 存放图片的文件夹 audio_file_path = 'voice.wav' # 语音文件路径 output_file_path = 'output.mp4' # 输出视频文件路径 create_video_with_voice(images_folder, audio_file_path, output_file_path) ``` 以上脚本使用OpenCV库读取指定文件夹的图片,并将其转换为视频帧。然后使用MoviePy库将所有视频帧拼接成一个视频。接着使用MoviePy库的AudioFileClip类读取语音文件,并将其与视频合并。最后,使用MoviePy库的TextClip类在视频添加文字,并将结果保存为输出视频文件。在示例,我们假设图片文件夹包含了需要制作视频的图片,语音文件是一个wav格式的文件。
评论 36
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Dragon少年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值