线稿图视频制作--从此短视频平台不缺上传视频了

news/2024/9/22 14:26:48/

  🔝🔝🔝🔝🔝🔝🔝🔝🔝🔝🔝🔝🔝🔝🔝 

🥰 博客首页:knighthood2001

😗 欢迎点赞👍评论🗨️

❤️ 热爱python,期待与大家一同进步成长!!❤️

👀给大家推荐一款很火爆的刷题、面试求职网站👀

跟我一起来巩固基础、开启刷题之旅吧

这年头还不来尝试线稿图视频??

        之前笔者也写过将视频转换为线稿图视频的教程,不过将其分成了五部分,也分了五个.py文件,这样虽然讲解很透彻,但是对于想要批量转换的话,每换一个视频,就要去每个.py文件中去修改相应的参数。因此显得非常麻烦。 

        因此本文将上述所有文件整合在一起,通过是需要更改视频文件名,即可输出相应的线稿图视频。这样就变得非常便捷了。

目录

一、目录介绍

二、模块导入

三、文件相关操作

四、获取原视频相应参数、逐帧保存

五、函数讲解

音频提取

原图-线稿图转换

生成无声视频

最终合成有声视频

调用函数

六、总结


一、目录介绍

         

        在线稿图目录下,只需要有py文件和原视频(如dindin.mp4)即可,剩下的只需运行代码,其会自动生成。

        代码最终生成的视频会放在和原视频同一目录下,而data文件夹下的内容,是代码运行过程中的其他文件,如分离出来的音频,转换前后的逐帧图片,无声视频。

        

本次例子以之前很火爆的叮叮当当舞。

二、模块导入

import os
import cv2
from PIL import Image
from PIL import ImageFilter
import moviepy.editor as mp

三、文件相关操作

# TODO 更改文件名称
file = 'dindin.mp4'
filename = file.split(".")[0]
mp3_file = f'{filename}.mp3'if not os.path.exists('data'):os.mkdir('data')
path = os.path.join('data', filename)
new_picture_path = os.path.join('data', filename + "_newpc")
if not os.path.exists(path):os.mkdir(path)
if not os.path.exists(new_picture_path):os.mkdir(new_picture_path)
# 无声视频
file_name = os.path.join('data', 'silence_' + file)
file = 'dindin.mp4'

file为原视频,放在代码相同目录下

注:一定要是英文,否则会因为编码问题出错

filename = file.split(".")[0]
为提取到的文件无后缀名称
mp3_file = f'{filename}.mp3'
为分离出来的mp3
if not os.path.exists('data'):os.mkdir('data')
path = os.path.join('data', filename)
new_picture_path = os.path.join('data', filename + "_newpc")
if not os.path.exists(path):os.mkdir(path)
if not os.path.exists(new_picture_path):os.mkdir(new_picture_path)

这段代码的意思是,首先判断是否有data文件夹,没有则创建。接下来

path = os.path.join('data', filename)
new_picture_path = os.path.join('data', filename + "_newpc")
表示data目录下存放两个文件夹,一个存放的是原视频的逐帧图片,另外一个存放的是新产生的线稿图片。接下来判断两个目录是否存在并创建。
# 无声视频
file_name = os.path.join('data', 'silence_' + file)

 将无声视频也存在data文件夹下面,因为也不是最终版本。

四、获取原视频相应参数、逐帧保存

cap = cv2.VideoCapture(file)
fps = int(cap.get(cv2.CAP_PROP_FPS))
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
print('fps:', fps, '\n', 'width:', width, '\n', 'height:', height, '\n', 'frames:', frames)for i in range(0, frames):flag, frame = cap.read()filename = path + '/{}.jpg'.format(str(i))print(filename)cv2.imwrite(filename, frame)

        首先读取视频,然后获取视频的fps、宽度、高度和总帧数,注意:使用get()函数获取到的数据类型是float类型,需要进行转换才能进行后续的操作,因此这里全部将其转为int类型。

        接下来我们将读取到的每帧图片保存起来    

flag, frame = cap.read()需要在for循环里面,否则每次保存的图片都是视频第一帧的图片。

五、函数讲解

        音频提取

# 音频提取
def extract_audio():my_clip = mp.VideoFileClip(file)my_clip.audio.write_audiofile('data/' + mp3_file)

这一部分内容很简单,就不细讲了 

        原图-线稿图转换

# 原图-线稿图转换
def convert():for i in range(0, frames):'''细节'''square = Image.open(path + "/{}.jpg".format(i))square1 = square.filter(ImageFilter.DETAIL)'''轮廓'''square2 = square1.filter(ImageFilter.CONTOUR)# videowrite.write(square2)square2.save(new_picture_path + "/{}.jpg".format(i))print(new_picture_path + "/{}.jpg".format(i))

frames是视频总帧数,该函数通过打开指定路径中的原图像,并通过两轮转换,将其保存到新路径中。 

        生成无声视频

# 生成无声视频
def picture_merge():size = (width, height)videowrite = cv2.VideoWriter(file_name, -1, fps, size)for i in range(0, frames):img = cv2.imread(new_picture_path + "/{}.jpg".format(i))videowrite.write(img)videowrite.release()print('end!')

该函数通过 

videowrite = cv2.VideoWriter(file_name, -1, fps, size)

将视频保存,将刚刚的获得的线稿图合成一个无声视频。

         最终合成有声视频

# 最终合成有声视频
def final_merge():video = mp.VideoFileClip(file_name)audio = mp.AudioFileClip('data/' + mp3_file)video_merge = video.set_audio(audio)video_merge.write_videofile('final_' + filename + '.mp4')

最终将上述的无声视频和分离的音频合成最终的视频。

        调用函数

if __name__ == '__main__':extract_audio()convert()picture_merge()final_merge()

主函数运行一下,大功告成了。

六、总结

        看到这,是不是觉得很棒呀,如果对你有帮助的话,麻烦来个三连吧🎈🎈 


http://www.ppmy.cn/news/673875.html

相关文章

数十万视频创作人都在使用的制作工具

一、色采 适合大部分人的审美,也能从中找到很多配色灵感, 你要是对颜色搭配不自信的话,一定要试试它哦,它还可以通过一张照片进行智能取色! 二、文案狗 是一款提供优质诗词、语录、美文的文案APP。在这里,你可以专注…

中忻嘉业科技:剪辑抖音视频需要注意的点有哪些

我们在做抖音短视频的时候需要注意的因素有很多,因为一个短视频能不能有好的效果与很多的因素都是有关的,比如脚本、设备、出镜达人、以及发布时间等,还有一个很重要的就是剪辑。剪辑师对于做抖音短视频来说是很重要的,那么我们在…

【AUTOSAR】BMS开发实际项目讲解(二十三)----电池管理系统高压互锁保护

高压互锁保护 关联的系统需求 TSR-BMS-6101、TSR-BMS-6102、TSR-BMS-6103、TSR-BMS-6104、TSR-BMS-6105、TSR-BMS-6106、TSR-BMS-6107、TSR-BMS-6108、TSR-BMS-6109、TSR-BMS-6110、TSR-BMS-6111; TSR-BMS-6201; TSR-BMS-6301; TSR-BMS-S101、TSR-BMS-S102、TSR-BMS-S103、TS…

C语言:数据的存储

往期文章 C语言:初识C语言C语言:分支语句和循环语句C语言:函数C语言:数组C语言:操作符详解C语言:指针详解C语言:结构体 目录 往期文章前言1. 数据的类型2. 整型在内存中的存储2.1 原码、反码、…

年终回顾 | 小米技术最受欢迎的技术文章TOP20

转眼间,小米技术已经陪伴大家度过了一整个年头。在一年里,我们始终坚持为大家提供有趣好玩的技术科普、硬核前沿的技术干货,带给大家一切有关小米的新鲜技术创新内容。 2023年就要到了,欢迎你点击文末左下角的“阅读原文”填写一份…

什么是头文件

在C语言家族程序中,头文件被大量使用。一般而言,每个C/C程序通常由头文件(header files)和定义文件(definition files)组成。头文件作为一种包含功能函数、数据接口声明的载体文件,用于保存程序的声明(declaration),而定义文件用于…

html文档的文件头的主要作用是什么,文件头

本词条缺少概述图,补充相关内容使词条更完整,还能快速升级,赶紧来编辑吧! 文件头是位于文件开头的一段承担一定任务的数据,一般都在开头的部分。 中文名 文件头 位 置 位于文件开头任 务 承担一定任务的数据 类 …

气传导蓝牙耳机品牌推荐,精选几款性价比超高的气传导耳机

蓝牙耳机大家都很熟悉,如果更了解一些的朋友,一定也知道气传导耳机。气传导耳机最大的好处就是在不入耳同时还可以听到外界周围环境的音效,很适合骑车或跑步的时候佩戴,使用更安全、不会屏蔽汽车鸣笛声,同时通话的过程…