草庐IT

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

knighthood2001 2023-04-03 原文

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

🥰 博客首页: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()

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

六、总结

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

有关线稿图视频制作--从此短视频平台不缺上传视频了的更多相关文章

  1. ruby - 我可以使用 aws-sdk-ruby 在 AWS S3 上使用事务性文件删除/上传吗? - 2

    我发现ActiveRecord::Base.transaction在复杂方法中非常有效。我想知道是否可以在如下事务中从AWSS3上传/删除文件:S3Object.transactiondo#writeintofiles#raiseanexceptionend引发异常后,每个操作都应在S3上回滚。S3Object这可能吗?? 最佳答案 虽然S3API具有批量删除功能,但它不支持事务,因为每个删除操作都可以独立于其他操作成功/失败。该API不提供任何批量上传功能(通过PUT或POST),因此每个上传操作都是通过一个独立的API调用完成的

  2. ruby-on-rails - 添加回形针新样式不影响旧上传的图像 - 2

    我有带有Logo图像的公司模型has_attached_file:logo我用他们的Logo创建了许多公司。现在,我需要添加新样式has_attached_file:logo,:styles=>{:small=>"30x15>",:medium=>"155x85>"}我是否应该重新上传所有旧数据以重新生成新样式?我不这么认为……或者有什么rake任务可以重新生成样式吗? 最佳答案 参见Thumbnail-Generation.如果rake任务不适合你,你应该能够在控制台中使用一个片段来调用重新处理!关于相关公司

  3. ruby-on-rails - 有没有办法为 CarrierWave/Fog 设置上传进度指示器? - 2

    我在Rails应用程序中使用CarrierWave/Fog将视频上传到AmazonS3。有没有办法判断上传的进度,让我可以显示上传进度如何? 最佳答案 CarrierWave和Fog本身没有这种功能;你需要一个前端uploader来显示进度。当我不得不解决这个问题时,我使用了jQueryfileupload因为我的堆栈中已经有jQuery。甚至还有apostonCarrierWaveintegration因此您只需按照那里的说明操作即可获得适用于您的应用的进度条。 关于ruby-on-r

  4. Unity 3D 制作开关门动画,旋转门制作,推拉门制作,门把手动画制作 - 2

    Unity自动旋转动画1.开门需要门把手先动,门再动2.关门需要门先动,门把手再动3.中途播放过程中不可以再次进行操作觉得太复杂?查看我的文章开关门简易进阶版效果:如果这个门可以直接打开的话,就不需要放置"门把手"如果门把手还有钥匙需要旋转,那就可以把钥匙放在门把手的"门把手",理论上是可以无限套娃的可调整参数有:角度,反向,轴向,速度运行时点击Test进行测试自己写的代码比较垃圾,命名与结构比较拉,高手轻点喷,新手有类似的需求可以拿去做参考上代码usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;u

  5. STM32读取串口传感器数据(颗粒物传感器,主动上传) - 2

    文章目录1.开发板选择*用到的资源2.串口通信(个人理解)3.代码分析(注释比较详细)1.主函数2.串口1配置3.串口2配置以及中断函数4.注意问题5.源码链接1.开发板选择我用的是STM32F103RCT6的板子,不过代码大概在F103系列的板子上都可以运行,我试过在野火103的霸道板上也可以,主要看一下串口对应的引脚一不一样就行了,不一样的就更改一下。*用到的资源keil5软件这里用到了两个串口资源,采集数据一个,串口通信一个,板子对应引脚如下:串口1,TX:PA9,RX:PA10串口2,TX:PA2,RX:PA32.串口通信(个人理解)我就从串口采集传感器数据这个过程说一下我自己的理解,

  6. 动漫制作技巧如何制作动漫视频 - 2

    动漫制作技巧是很多新人想了解的问题,今天小编就来解答与大家分享一下动漫制作流程,为了帮助有兴趣的同学理解,大多数人会选择动漫培训机构,那么今天小编就带大家来看看动漫制作要掌握哪些技巧?一、动漫作品首先完成草图设计和原型制作。设计草图要有目的、有对象、有步骤、要形象、要简单、符合实际。设计图要一致性,以保证制作的顺利进行。二、原型制作是根据设计图纸和制作材料,可以是手绘也可以是3d软件创建。在此步骤中,要注意的问题是色彩和平面布局。三、动漫制作制作完成后,加工成型。完成不同的表现形式后,就要对设计稿进行加工处理,使加工的难易度降低,并得到一些基本准确的概念,以便于后续的大样、准确的尺寸制定。四、

  7. python ffmpeg 使用 pyav 转换 一组图像 到 视频 - 2

    2022/8/4更新支持加入水印水印必须包含透明图像,并且水印图像大小要等于原图像的大小pythonconvert_image_to_video.py-f30-mwatermark.pngim_dirout.mkv2022/6/21更新让命令行参数更加易用新的命令行使用方法pythonconvert_image_to_video.py-f30im_dirout.mkvFFMPEG命令行转换一组JPG图像到视频时,是将这组图像视为MJPG流。我需要转换一组PNG图像到视频,FFMPEG就不认了。pyav内置了ffmpeg库,不需要系统带有ffmpeg工具因此我使用ffmpeg的python包装p

  8. TimeSformer:抛弃CNN的Transformer视频理解框架 - 2

    Transformers开始在视频识别领域的“猪突猛进”,各种改进和魔改层出不穷。由此作者将开启VideoTransformer系列的讲解,本篇主要介绍了FBAI团队的TimeSformer,这也是第一篇使用纯Transformer结构在视频识别上的文章。如果觉得有用,就请点赞、收藏、关注!paper:https://arxiv.org/abs/2102.05095code(offical):https://github.com/facebookresearch/TimeSformeraccept:ICML2021author:FacebookAI一、前言Transformers(VIT)在图

  9. ruby-on-rails - 安全地显示使用回形针 gem 上传的图像 - 2

    默认情况下:回形针gem将所有附件存储在公共(public)目录中。出于安全原因,我不想将附件存储在公共(public)目录中,所以我将它们保存在应用程序根目录的uploads目录中:classPost我没有指定url选项,因为我不希望每个图像附件都有一个url。如果指定了url:那么拥有该url的任何人都可以访问该图像。这是不安全的。在user#show页面中:我想实际显示图像。如果我使用所有回形针默认设置,那么我可以这样做,因为图像将在公共(public)目录中并且图像将具有一个url:Someimage:看来,如果我将图像附件保存在公共(public)目录之外并且不指定url(同

  10. ruby - 如何更改此正则表达式以从未指定 v 参数的 Youtube URL 获取 Youtube 视频 ID? - 2

    目前我正在使用这个正则表达式从YoutubeURL中提取视频ID:url.match(/v=([^&]*)/)[1]我怎样才能改变它,以便它也可以从这个没有v参数的YoutubeURL获取视频ID:http://www.youtube.com/user/SHAYTARDS#p/u/9/Xc81AajGUMU感谢阅读。编辑:我正在使用ruby​​1.8.7 最佳答案 对于Ruby1.8.7,这就可以了。url_1='http://www.youtube.com/watch?v=8WVTOUh53QY&feature=feedf'url

随机推荐