使用python制作字符视频(蔡徐坤唱跳rap字符视频)

这篇具有很好参考价值的文章主要介绍了使用python制作字符视频(蔡徐坤唱跳rap字符视频)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

 我生成了一个蔡徐坤 唱、跳、RAP的字符视频,链接为:

蔡徐坤唱跳RAP字符视频

使用python将一个视频转换为字符视频

详细视频教程,总共8分钟。

用python制作字符视频详细教程(视频版)

文字教程见下文:

首先需要安装python

然后安装所需要的包:cv2、PIL

具体安装方法:

安装cv2

pip install opencv-python

安装PIL

pip install pillow

在安装过程中经常遇到安装时间过长、安装失败等问题。

可以在官网下载对应版本的whl文件,采用本地安装的方法。

opencv-python官方下载地址   

pillow官方下载地址

我的博客下载地址

下载时需要注意自己的电脑是32位还是64位,

需要注意自己电脑上装的python是多少版本的,

选择opencv_python和pillow时,要对应上才行。

此外还需要下载ffmpeg包,用来抽取视频中的声音,以及将声音添加到生成的字符视频中。

如果不配置ffmpeg的话,生成的视频是没有声音的。

下载时同样要注意自己的电脑是32位还是64位。

ffmpeg32位和64位下载地址

下载好ffmpeg包之后还需要配置环境变量。

等一切准备工作就绪之后,就可以运行python代码生成字符视频了,python代码如下。

import argparse
import os
import cv2
import subprocess
from cv2 import VideoWriter_fourcc
from PIL import Image, ImageFont, ImageDraw

class Video2CodeVideo:
    def __init__(self):
        self.config_dict = {
            # 原视频文件
            "input_file": "test.mp4",
            # 中间文件存放目录
            "cache_dir": "cache",
            # 是否保留过程文件。True--保留,False--不保留
            "save_cache_flag": True,
            # 使用使用的字符集
            "ascii_char_list": list("01B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:oa+>!:+. "),
        }

    # 第一步从函数,将像素转换为字符
    # 调用栈:video_2_txt_jpg -> txt_2_image -> rgb_2_char
    def rgb_2_char(self, r, g, b, alpha=256):
        if alpha == 0:
            return ''
        length = len(self.config_dict["ascii_char_list"])
        gray = int(0.2126 * r + 0.7152 * g + 0.0722 * b)
        unit = (256.0 + 1) / length
        return self.config_dict["ascii_char_list"][int(gray / unit)]

    # 第一步从函数,将txt转换为图片
    # 调用栈:video_2_txt_jpg -> txt_2_image -> rgb_2_char
    def txt_2_image(self, file_name):
        im = Image.open(file_name).convert('RGB')
        # gif拆分后的图像,需要转换,否则报错,由于gif分割后保存的是索引颜色
        raw_width = im.width
        raw_height = im.height
        width = int(raw_width / 6)
        height = int(raw_height / 15)
        im = im.resize((width, height), Image.NEAREST)

        txt = ""
        colors = []
        for i in range(height):
            for j in range(width):
                pixel = im.getpixel((j, i))
                colors.append((pixel[0], pixel[1], pixel[2]))
                if (len(pixel) == 4):
                    txt += self.rgb_2_char(pixel[0], pixel[1], pixel[2], pixel[3])
                else:
                    txt += self.rgb_2_char(pixel[0], pixel[1], pixel[2])
            txt += '\n'
            colors.append((255, 255, 255))

        im_txt = Image.new("RGB", (raw_width, raw_height), (255, 255, 255))
        dr = ImageDraw.Draw(im_txt)

        font = ImageFont.load_default().font
        x = y = 0
        # 获取字体的宽高
        font_w, font_h = font.getsize(txt[1])
        font_h *= 1.37  # 调整后更佳
        # ImageDraw为每个ascii码进行上色
        for i in range(len(txt)):
            if (txt[i] == '\n'):
                x += font_h
                y = -font_w
            dr.text((y, x), txt[i], fill=colors[i])

            y += font_w
        name = file_name
        im_txt.save(name)


    # 第一步,将原视频转成字符图片
    # 调用栈:video_2_txt_jpg -> txt_2_image -> rgb_2_char
    def video_2_txt_jpg(self, file_name):
        vc = cv2.VideoCapture(file_name)
        c = 1
        if vc.isOpened():
            r, frame = vc.read()
            if not os.path.exists(self.config_dict["cache_dir"]):
                os.mkdir(self.config_dict["cache_dir"])
            os.chdir(self.config_dict["cache_dir"])
        else:
            r = False
        while r:
            cv2.imwrite(str(c) + '.jpg', frame)
            self.txt_2_image(str(c) + '.jpg')  # 同时转换为ascii图
            r, frame = vc.read()
            c += 1
        os.chdir('..')
        return vc

    # 第二步,将字符图片合成新视频
    def txt_jpg_2_video(self, outfile_name, fps):
        fourcc = VideoWriter_fourcc(*"MJPG")

        images = os.listdir(self.config_dict["cache_dir"])
        im = Image.open(self.config_dict["cache_dir"] + '/' + images[0])
        vw = cv2.VideoWriter(outfile_name + '.avi', fourcc, fps, im.size)

        os.chdir(self.config_dict["cache_dir"])
        for image in range(len(images)):

            frame = cv2.imread(str(image + 1) + '.jpg')
            vw.write(frame)

        os.chdir('..')
        vw.release()

    # 第三步,从原视频中提取出背景音乐
    def video_extract_mp3(self, file_name):
        outfile_name = file_name.split('.')[0] + '.mp3'
        subprocess.call('ffmpeg -i ' + file_name + ' -f mp3 -y ' + outfile_name, shell=True)

    # 第四步,将背景音乐添加到新视频中
    def video_add_mp3(self, file_name, mp3_file):
        outfile_name = file_name.split('.')[0] + '-txt.mp4'
        subprocess.call('ffmpeg -i ' + file_name + ' -i ' + mp3_file + ' -strict -2 -f mp4 -y ' + outfile_name, shell=True)

    # 第五步,如果没配置保留则清除过程文件
    def clean_cache_while_need(self):
        # 为了清晰+代码比较短,直接写成内部函数
        def remove_cache_dir(path):
            if os.path.exists(path):
                if os.path.isdir(path):
                    dirs = os.listdir(path)
                    for d in dirs:
                        if os.path.isdir(path + '/' + d):
                            remove_cache_dir(path + '/' + d)
                        elif os.path.isfile(path + '/' + d):
                            os.remove(path + '/' + d)
                    os.rmdir(path)
                    return
                elif os.path.isfile(path):
                    os.remove(path)
                return
        # 为了清晰+代码比较短,直接写成内部函数
        def delete_middle_media_file():
            os.remove(self.config_dict["input_file"].split('.')[0] + '.mp3')
            os.remove(self.config_dict["input_file"].split('.')[0] + '.avi')
        # 如果没配置保留则清除过程文件
        if not self.config_dict["save_cache_flag"]:
            remove_cache_dir(self.config_dict["cache_dir"])
            delete_middle_media_file()

    # 程序主要逻辑
    def main_logic(self):
        # 第一步,将原视频转成字符图片
        print("第一步,正在将原视频转成字符图片")
        vc = self.video_2_txt_jpg(self.config_dict["input_file"])
        # 获取原视频帧率
        fps = vc.get(cv2.CAP_PROP_FPS)
        print("获取原视频帧率:")
        print(fps)
        vc.release()
        print("已将原视频转成字符图片\n")
        # 第二步,将字符图片合成新视频
        print("第二步,正在将字符图片合成新视频")
        self.txt_jpg_2_video(self.config_dict["input_file"].split('.')[0], fps)
        print(self.config_dict["input_file"], self.config_dict["input_file"].split('.')[0] + '.mp3')
        print("已将字符图片合成新视频\n")
        # 第三步,从原视频中提取出背景音乐
        print("第三步, 正在从原视频中提取出背景音乐")
        self.video_extract_mp3(self.config_dict["input_file"])
        print("已从原视频中提取出背景音乐\n")
        # 第四步,将背景音乐添加到新视频中
        print("第四步, 正在将背景音乐添加到新视频中")
        self.video_add_mp3(self.config_dict["input_file"].split('.')[0] + '.avi', self.config_dict["input_file"].split('.')[0] + '.mp3')
        print("已将背景音乐添加到新视频中\n")
        # 第五步,如果没配置保留则清除过程文件
        self.clean_cache_while_need()
        print("字符视频制作完毕\n字符视频为test-txt.mp4\n")
        print("按任意键结束")
        a=input()

if __name__ == '__main__':
    obj = Video2CodeVideo()
    obj.main_logic()

注意要将源视频和python代码放在一个目录下,将原视频命名为test.mp4,运行结束后,会生成一个test-txt.mp4文件,就是我们想要的字符视频。

使用python制作字符视频(蔡徐坤唱跳rap字符视频)

有问题欢迎交流文章来源地址https://www.toymoban.com/news/detail-410884.html

到了这里,关于使用python制作字符视频(蔡徐坤唱跳rap字符视频)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 如何使用ffmpeg制作透明背景的视频

      最近我们尝试在网页上叠加数字人讲解的功能,发现如果直接在网页上放一个矩形的数字人视频,效果会很差,首先是会遮挡很多画面的内容,其次就是不管使用任何任务背景,画面都和后面的网页不是很协调,如图所示:   如果能去掉视频的背景,只展示人物效果就

    2024年02月05日
    浏览(47)
  • 如何使用ArcGIS Earth制作地图动画视频

    通常情况下,我们所看到的地图都是静态展示,对于信息的传递,视频比图片肯定会更加丰富,所以制作地图动画视频更加有利于信息的传递,这里我们讲解一下ArcGIS Earth 2.0如何制作地图动画视频,希望能对你有所帮助。 在左上方工具条上点击Movie按钮,开启视频制作,如下

    2024年02月10日
    浏览(49)
  • Matlab/Python教程系列 | 根据目录下的已有图片制作视频(动画)

    注1:本文系“MATLAB/Python编程教程”系列之一,致力于使用Python和Matlab实现特定的功能。本次要实现的功能是:根据目录下的已有图片制作视频(动画)。 在这个教程中,我们将一起学习如何使用MATLAB和Python编程语言,根据目录下的已有图片制作视频(动画)。我们将从头开始,逐

    2024年02月09日
    浏览(42)
  • python实现视频抽帧,文件批量操作,文件批量处理(数据集制作的工具箱)

    环境准备 数据集制作 文件批量重命名 文件批量移动 将文件批量按照一定格式进行重命名 修改xml文件内容的方法 Pathlib库的常用接口 在计算机视觉项目中,文件批量操作和文件批量预处理是必不可少的步骤。它们涉及处理大量的图像文件,包括读取、处理、保存和预处理。

    2024年02月09日
    浏览(70)
  • 【Python搞笑游戏】因蔡徐坤打篮球动作超火,被某程序员写成了一款游戏,画面美到不敢看,成功学到了精髓~(附源码免费)

    之前网络最火的梗,非“C徐坤打篮球”莫属。个人感觉,只有多年前的“春哥纯爷们”堪与匹敌! 虽然说C徐坤打篮球是一个老梗了,但是确实非常搞笑,今天就跟着小编一起来回忆一下吧! “我是练习两年半的个人练习生— C 徐坤,喜欢,唱、跳、RAP、 打篮球......” 那么

    2023年04月16日
    浏览(43)
  • 用python代码实现ChatGPT平台和剪映/百度AIGC平台制作短视频的自动化的讨论

      使用ChatGPT平台生成短视频的文本描述 将文本描述传入剪映/百度AIGC平台,生成短视频 使用ChatGPT平台生成短视频的文本描述 使用剪映/百度AIGC平台生成短视频

    2024年02月15日
    浏览(55)
  • 终于来了,Runway gen2 制作AI视频的全功能超详细使用教程

    最近有好几个学员私信我们,让我出一期Runway完整的使用教程,刚好11月Runway对外发布运动涂笔等新功能,那么今天就给大家安排一期全功能,超详细的从Gen1到Gen2的使用教程。 Runway 是国外一家在线视频剪辑制作网站,作为全球AI视频制作前沿模型,目前拥有30多个AI应用工具

    2024年02月03日
    浏览(47)
  • 蔡徐坤打篮球and源码

    就在今天我发现我的第一篇文章:  (9条消息) c++ 【绝对收藏坑朋友的好东西】病毒_Tzsnb的博客-CSDN博客 的展现量 达到了 120 阅读量到了43 (不知道看那些都是心里想着什么的人) 由于我是 小黑子 i k u n所以我亲爱的可爱的编程老师找我要                 蔡徐坤打篮球的源

    2024年02月16日
    浏览(37)
  • 使用python制作常用图表

    运行结果打开柱形图.xlsx即可查看  用特定含义的字符串来指定图表类型,常用图表类型对应的字符串如下: 图表类型 字符串 图表类型 字符串 柱形图 ‘column_clustered\\\' 饼图 \\\'pie\\\' 条形图 \\\'bar_clustered\\\' 圆环图 ‘doughnut’ 折线图 ‘line’ 散点图 ‘xy_scatter\\\' 面积图 ’area‘ 雷达图

    2024年02月06日
    浏览(36)
  • 国内百度、阿里、讯飞推出的AI聊天机器人,注册申请后可免费使用,还可AI绘画、制作短视频

    目录 百度 - 文心一言 百度 - AIGC创作平台 讯飞 - 星火认知 阿里 - 通义大模型 使用门槛 :需注册账号,登录使用 主要功能 :文本生成 使用链接 : 文心一言   使用门槛 :需注册账号,登录使用 主要功能 :制作短视频、文笔润色、写诗、文案... 使用链接 : 度加创作工具

    2024年02月11日
    浏览(119)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包