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


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

    🥰 博客首页:knighthood2001

    😗 欢迎点赞👍评论🗨️

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

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

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

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

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

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

    目录

    一、目录介绍

    二、模块导入

    三、文件相关操作

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

    五、函数讲解

    音频提取

    原图-线稿图转换

    生成无声视频

    最终合成有声视频

    调用函数

    六、总结


    一、目录介绍

             

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

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

            

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

    二、模块导入

    1. import os
    2. import cv2
    3. from PIL import Image
    4. from PIL import ImageFilter
    5. import moviepy.editor as mp

    三、文件相关操作

    1. # TODO 更改文件名称
    2. file = 'dindin.mp4'
    3. filename = file.split(".")[0]
    4. mp3_file = f'{filename}.mp3'
    5. if not os.path.exists('data'):
    6. os.mkdir('data')
    7. path = os.path.join('data', filename)
    8. new_picture_path = os.path.join('data', filename + "_newpc")
    9. if not os.path.exists(path):
    10. os.mkdir(path)
    11. if not os.path.exists(new_picture_path):
    12. os.mkdir(new_picture_path)
    13. # 无声视频
    14. file_name = os.path.join('data', 'silence_' + file)
    file = 'dindin.mp4'

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

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

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

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

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

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

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

    1. cap = cv2.VideoCapture(file)
    2. fps = int(cap.get(cv2.CAP_PROP_FPS))
    3. width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
    4. height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
    5. frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
    6. print('fps:', fps, '\n', 'width:', width, '\n', 'height:', height, '\n', 'frames:', frames)
    7. for i in range(0, frames):
    8. flag, frame = cap.read()
    9. filename = path + '/{}.jpg'.format(str(i))
    10. print(filename)
    11. cv2.imwrite(filename, frame)

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

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

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

    五、函数讲解

            音频提取

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

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

            原图-线稿图转换

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

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

            生成无声视频

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

    该函数通过 

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

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

             最终合成有声视频

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

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

            调用函数

    1. if __name__ == '__main__':
    2. extract_audio()
    3. convert()
    4. picture_merge()
    5. final_merge()

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

    六、总结

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

  • 相关阅读:
    22071驱动day1
    如何在自己的项目中实现脚手架的命令行交互
    【博学谷学习记录】超强总结,用心分享|架构师-基于redis的分布式锁
    kubernetes-nvidia-plugin设计解读
    SSM+手机销售网站 毕业设计-附源码161043
    基于go-micro微服务的实战-注册成功推送Rabbitmq队列,邮件服务异步发送邮件(七)
    【MySQL学习】常见命令
    Java 包及访问控制权限 要点
    python 按照对象某一个属性去重
    数据挖掘-05
  • 原文地址:https://blog.csdn.net/knighthood2001/article/details/126912547