使用python实现代码动画视频

使用python实现代码动画视频

前言

最近在CSDN上面看到一个将视频转换为由代码组成的视频,所以想自己写一个。参考的原文博客为:https://blog.csdn.net/hhladminhhl/article/details/118463344

功能:使用python实现将动画转换为有字符组成的视频。
实现方法分为如下几步:
1、将视频从网站上面下载下来
2、将视频截取为GIF,把截取的GIF进行ASCII字符转换
3、将转换好的字符gif根据每一帧的顺序进行重命名,然后排序
4、将排序后的每一帧gif图片转换为jpg图片
5、将字符图片合成视频

实现步骤

1、准备阶段

想要将视频制作出来,我们想要用到如下几个工具:
(1)、将视频下载下来的工具,我这里使用的是you-get。
you-get安装方法:
下载的命名:

pip install you-get

下载you-get截图:

下载you-get
确认you-get下载成功截图:
you-get下载成功截图
(2)、将视频转换为GIF图的工具,我这里使用的是迅捷视频转换器。
迅捷视频转换器下载地址:https://www.xunjieshipin.com/video-converter
迅捷视频转换器使用界面截图:
迅捷视频转换器截图
(3)、将GIF转换为字符的工具,我这里使用的是ASCII Animator
ASCII Animator下载地址:http://www.qqpr.com/
(4)、在文件中需要使用到的库:cv2、os、opecv-python
下载需要使用的命名:

pip install cv2	# 用于处理图像的库
pip install os	# 用于处理文件的库
pip install opencv-python	# 用于处理图像的库

2、下载视频

通过you-get将视频下载到本地,我这里使用的是《如果历史是一群喵第六季》的op。
《如果历史是一群喵第六季》视频链接:
https://www.bilibili.com/bangumi/play/ep399825
下载视频使用的命令:

you-get -o 本地保存路径 视频链接

下载视频过程截图:
使用you-get下载视频
这样我们就成功将视频下载到本地
下载下来的视频

3、截取GIF图

接下来将下载后的视频进行GIF截取,我这里使用的是迅捷视频转换器。注意:截取视频时长尽量不能太长,否则在进行ASCII转换时会因为内存不够而报错,每次截取3s。
迅捷视频转换器截取GIF过程截图:
截取GIF过程1
截取GIF过程2
将截取出来的gif文件安装顺序1、2、3将gif命名。
重命名后的gif截图

4、将GIF转换为ASCII

使用ASCII Animator将截取的GIF每一帧图片转换为ASCII。注意:需要设置每100个像素宽度的字符数(我设置的是75)和输出类型选择动画ASCII(.gif)。
使用ASCII Animator截图。由于转换后图片占用内存太大,所以只用一个gif进行举例。
使用ASCII Animator软件
我们可以在输出路径里面找到gif每一帧转换的ASCII的gif,将gif复制到python项目下material/img文件夹中,以便后续的处理(在复制文件时按照自己的需求确定复制路径)。

5、gif文件重命名

思路:使用os.listdir(path)读取路径下所有的文件名称,然后通过for遍历每一个文件、使用os.rename(src, dst)对文件重命名。
实现代码:

# 导入包
import os
import cv2
from PIL import Image

# 定义重命名的函数
def rename_gif(gif_path):
    """
    定义重命名的函数
    :param gif_path: gif图片存储的路径
    :return:
    """
    # 使用os.listdir(path)读取路径下所有的文件名称
    file_list = os.listdir(gif_path)
    # 使用len()获取文件夹下文件的数量
    n = len(file_list)
    # 使用for循环遍历文件夹下的所有文件
    for i in range(n):
        s = str(file_list[i])   # 获取第i个文件的名称
        src = gif_path + s      # 重命名前名称
        dst = gif_path + s[8: 10] + s[-4:]  # 重命名后名称
        os.rename(src, dst)     # 对文件重命名

rename_gif('./material/img/') # 调用重命名函数

gif重命名后,所有的gif已经按照每一帧的顺序排列好了,后续处理时按照图片名称进行处理就行了。
重命名后的图片:
重命名后的结果

6、将gif转换为jpg图片

按照帧顺序排列的gif转换为jpg图片。注意:不能直接将文件后缀名该为jpg,那样文件格式还是没有变,使用cv2读取时会为空。
思路:
1、使用os.listdir(path)读取路径下所有的文件名称
2、使用Image.open(path)读取gif格式的图片
3、使用im.convert(‘RGB’)将图片格式转换为jpg格式
4、使用frame.save()将转换后的图片写回文件夹。
实现的代码:

# 导入包
import os
import cv2
from PIL import Image

# 定义用于迭代图片数据的函数
def iter_frames(im):
    try:
        i = 0
        while 1:
            im.seek(i)
            imframe = im.copy()
            if i == 0:
                palette = imframe.getpalette()
            else:
                imframe.putpalette(palette)
            yield imframe
            i += 1
    except EOFError:
        pass

# 定义将gif图片转换为jpg图片的函数
def gif2jpg(gif_path, jpg_path):
    """
    定义将gif图片转换为jpg图片的函数
    :param gif_path: 存储gif图片的路径
    :param jpg_path: 存储jpg图片的路径
    :return:
    """
    # 获取所有gif图片名称
    file_list = os.listdir(gif_path)
    # 将图片排序,以名称字符串的数字进行排列
    file_list.sort(key=lambda x: int(x[: -4]))
    # 使用for循环读取所有的gif图片
    for img in file_list:
        # 判断是否为gif格式的图片
        if img[-4:] == '.gif':
            im = Image.open(gif_path + img)    # 打开图片
            im = im.convert('RGB')  # 转换格式
            # 当存储jpg图片的路径不存在时创建路径
            if not os.path.exists(jpg_path):
                os.makedirs(jpg_path)
            # 进行图片的转换
            for i, frame in enumerate(iter_frames(im)):
                frame.save(jpg_path + img[0: -4] + '.jpg', **frame.info)

gif2jpg('./material/img/', './img/')    # 调用将gif转换为jpg的函数

转换后的图片:
转换后的图片

7、将图片合成视频

思路:
1、使用os.listdir(path)读取路径下所有的文件名称
2、使用cv2.VideoWriter_fourcc(‘m’, ‘p’, ‘4’, ‘v’)确定视频格式为.mp4
3、使用Image.open(path)打开一张图片,用于确定合成视频的宽度和高度。
4、使用cv2.VideoWriter(video_path, fourcc, fps, im.size)创建视频,video_path确定视频存储路径,fourcc确定视频格式,fps确定视频每一秒帧数,im.size确定视频宽度和高度。
5、使用cv2.imread(path)读取需要插入视频的图片
6、使用video_writer.write(frame)将图片写入视频中。
7、使用video_writer.release()将视频释放。
实现过程的代码:

# 导入包
import os
import cv2
from PIL import Image

# 定义图片转换为视频的函数
def jpg2video(jpg_path, video_path):
    """
    定义图片转换为视频的函数
    :param jpg_path: jpg图片所在文件夹
    :param video_path: 视频存储路径
    :return:
    """
    # 使用os.listdir(path)获取所有jpg图片名称
    jpg_list = os.listdir(jpg_path)
    # 将图片排序,以名称字符串的数字进行排列
    jpg_list.sort(key=lambda x: int(x[: -4]))
    fps = 21    # 定义每一秒的帧数
    # 视频格式为mp4格式
    fourcc = cv2.VideoWriter_fourcc('m', 'p', '4', 'v')
    im = Image.open(jpg_path + jpg_list[0])   # 打开第一张图片
    # 设置写入视频的要求,参数(写入的路径, 格式, 每一秒的帧数,视频宽高)
    video_writer = cv2.VideoWriter(video_path, fourcc, fps, im.size)
    print(jpg_list)
    # 使用for循环将图片写入视频中
    for jpg_i in jpg_list:
        frame = cv2.imread(jpg_path + jpg_i)    # 使用cv2导入图片
        print('开始将' + jpg_i + '加入视频')
        video_writer.write(frame)   # 将图片加入视频
    video_writer.release()  # 释放video_writer

jpg2video('./img/', './video.mp4')      # 调用图片转换为视频函数

最终的效果:
合成后的视频

8、完整的代码

"""
功能:将图片合成一个视频
"""
# 导入包
import os
import cv2
from PIL import Image

# 第一步将gif图像重命名
# 定义重命名的函数
def rename_gif(gif_path):
    """
    定义重命名的函数
    :param gif_path: gif图片存储的路径
    :return:
    """
    # 使用os.listdir(path)读取路径下所有的文件名称
    file_list = os.listdir(gif_path)
    # 使用len()获取文件夹下文件的数量
    n = len(file_list)
    # 使用for循环遍历文件夹下的所有文件
    for i in range(n):
        s = str(file_list[i])   # 获取第i个文件的名称
        src = gif_path + s      # 重命名前
        dst = gif_path + s[8: 10] + s[-4:]  # 重命名后
        os.rename(src, dst)     # 对文件重命名

# 第二步将gif图片转换为jpg图片
# 定义用于迭代图片数据的函数
def iter_frames(im):
    try:
        i = 0
        while 1:
            im.seek(i)
            imframe = im.copy()
            if i == 0:
                palette = imframe.getpalette()
            else:
                imframe.putpalette(palette)
            yield imframe
            i += 1
    except EOFError:
        pass

# 定义将gif图片转换为jpg图片的函数
def gif2jpg(gif_path, jpg_path):
    """
    定义将gif图片转换为jpg图片的函数
    :param gif_path: 存储gif图片的路径
    :param jpg_path: 存储jpg图片的路径
    :return:
    """
    # 获取所有gif图片名称
    file_list = os.listdir(gif_path)
    # 将图片排序,以名称字符串的数字进行排列
    file_list.sort(key=lambda x: int(x[: -4]))
    # 使用for循环读取所有的gif图片
    for img in file_list:
        # 判断是否为gif格式的图片
        if img[-4:] == '.gif':
            im = Image.open(gif_path + img)    # 打开图片
            im = im.convert('RGB')  # 转换格式
            # 当存储jpg图片的路径不存在时创建路径
            if not os.path.exists(jpg_path):
                os.makedirs(jpg_path)
            # 进行图片的转换
            for i, frame in enumerate(iter_frames(im)):
                frame.save(jpg_path + img[0: -4] + '.jpg', **frame.info)

# 第三步将图片转换为视频
# 定义图片转换为视频的函数
def jpg2video(jpg_path, video_path):
    """
    定义图片转换为视频的函数
    :param jpg_path: jpg图片所在文件夹
    :param video_path: 视频存储路径
    :return:
    """
    # 使用os.listdir(path)获取所有jpg图片名称
    jpg_list = os.listdir(jpg_path)
    # 将图片排序,以名称字符串的数字进行排列
    jpg_list.sort(key=lambda x: int(x[: -4]))
    fps = 21    # 定义每一秒的帧数
    # 视频格式为mp4格式
    fourcc = cv2.VideoWriter_fourcc('m', 'p', '4', 'v')
    im = Image.open(jpg_path + jpg_list[0])   # 打开第一张图片
    # 设置写入视频的要求,参数(写入的路径, 格式, 每一秒的帧数,视频宽高)
    video_writer = cv2.VideoWriter(video_path, fourcc, fps, im.size)
    print(jpg_list)
    # 使用for循环将图片写入视频中
    for jpg_i in jpg_list:
        frame = cv2.imread(jpg_path + jpg_i)    # 使用cv2导入图片
        print('开始将' + jpg_i + '加入视频')
        video_writer.write(frame)   # 将图片加入视频
    video_writer.release()  # 释放video_writer

# rename_gif('./material/img/') # 调用重命名函数
#gif2jpg('./material/img/', './img/')    # 调用将gif转换为jpg的函数
jpg2video('./img/', './video.mp4')      # 调用图片转换为视频函数

  • 3
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
使用Python来自动生成视频字幕,你可以按照以下步骤进行操作: 1. 首先,你需要安装一些Python库。根据引用和引用提供的信息,你可以使用pip来安装pydub和moviepy库,分别用于音频文件分割和提取视频中的语音。 2. 一旦安装了这些库,你可以开始编写代码来生成字幕。首先,你需要将视频文件加载到你的代码中。使用moviepy库,你可以使用以下代码实现: ```python from moviepy.editor import VideoFileClip video = VideoFileClip("your_video_file.mp4") ``` 3. 接下来,你需要将视频中的语音提取出来。你可以使用moviepy库提供的方法来提取音频: ```python audio = video.audio ``` 4. 现在你已经得到了视频的音频文件,你可以使用pydub库来进行音频分割。根据引用的信息,你可以使用以下代码来完成音频分割: ```python from pydub import AudioSegment audio_segments = AudioSegment.from_wav(audio.filename).split() ``` 5. 现在你已经将音频文件分割成了多个小段,接下来可以根据需要对每个小段进行处理并生成对应的字幕。你可以使用字幕生成算法,例如语音识别或文本转语音技术,将每个音频段转换为相应的文本。 6. 最后,你可以将生成的字幕保存为字幕文件,常见的字幕文件格式包括SRT、VTT等。你可以使用Python提供的文件操作方法将文本写入字幕文件中。 请注意,这只是一个简单的示例,你可能还需要根据具体需求和数据格式进行一些调整。此外,生成字幕是一个复杂的任务,可能需要使用更高级的语音处理和机器学习技术来提高准确性和效果。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [一次用Python制作电影字幕的尝试](https://blog.csdn.net/weixin_42789334/article/details/121331711)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值