Python基础详解(十三):(视频符号化)将视频转换成ASCII符号形式展示出来

发布于:2022-12-21 ⋅ 阅读:(537) ⋅ 点赞:(0)

一. 前言

今天手把手教大家如何把视频代码化~

二. 项目简介

本项目的目的是将宣传视频转成ASCII符号形式展示出来。

三. 基本要求

  1. 安装ffmpeg.exe
  2. 安装you-get库,下载视频
  3. 创建目录,将视频按帧分割成图片存入目录
  4. 遍历将图片转成ASCII形式的图片
  5. 合成视频
  6. 获取音频文件
  7. 合并视频和音频文件

四. 代码实现

4.1 安装ffmpeg.exe

将下载的文件解压缩,然后找到bin目录,添加到环境变量。
最后记得点击确认。

4.2 安装you-get库

4.2.1 下载

pip install you-get

4.2.2 检查视频信息

you-get -i url

4.2.3 下载 mp3 格式视频

记得提前下载ffmpeg,否则可能出现音频、视频分开的情况。
-o 后面加 保存路径 视频URL

you-get --format=dash-flv -o D:\PyCharm\Projects\bingdundun url

4.3 执行代码

保存的视频就在项目文件夹里面

加载包:

from PIL import Image, ImageDraw, ImageFont
import numpy as np
import os
import shutil

创建存储图片的路径:

def createpath(self):
        # 源视频文件的图片路径
        if not os.path.exists(self.pic_path):
            os.makedirs(self.pic_path)
        else:
            # 清空在创建
            shutil.rmtree(self.pic_path)
            os.makedirs(self.pic_path)

        # 转换之后的图片路径
        if not os.path.exists(self.ascii_path):
            os.makedirs(self.ascii_path)
        else:
            # 清空再创建
            shutil.rmtree(self.ascii_path)
            os.makedirs(self.ascii_path)

        # 存储输出文件的目录
        if not os.path.exists(self.outpath):
            os.makedirs(self.outpath)

将视频分割为图片:

def video2pic(self):
        # 使用ffmpeg切割图片,命令行如下
        cmd = 'ffmpeg -i {0} -r 24 {1}/%06d.jpeg'.format(self.filename, self.pic_path)
        os.system(cmd)

将图片缩放、转成ascii形式:

def pic2ascii(self):
        # 读取原始图片目录
        pic_list = sorted(os.listdir(self.pic_path))

        total_len = len(pic_list)
        count = 1
        # 遍历每张图片
        for pic in pic_list:
            # 图片完整路径
            imgpath = os.path.join(self.pic_path, pic)
            # 1、缩小图片,转成灰度模式,存入数组
            origin_img = Image.open(imgpath)
            # 缩小之后宽高
            resize_width = int(origin_img.size[0] / self.resize_times)
            resize_height = int(origin_img.size[1] / self.resize_times)
            resize_img = origin_img.resize((resize_width, resize_height), Image.ANTIALIAS).convert("L")
            img_arr = np.array(resize_img)
            # 2、新建空白图片(灰度模式、与原始图片等宽高)
            new_img = Image.new("L", origin_img.size, 255)
            draw_obj = ImageDraw.Draw(new_img)
            font = ImageFont.truetype("arial.ttf", 8)
            # 3、将每个字符绘制在 8*8 的区域内
            for i in range(resize_height):
                for j in range(resize_width):
                    x, y = j * self.resize_times, i * self.resize_times
                    index = int(img_arr[i][j] / 4)
                    draw_obj.text((x, y), self.ascii_char[index], font=font, fill=0)
            # 4、保存字符图片
            new_img.save(os.path.join('temp_ascii', pic), "JPEG")
            print("已生成ascii图(%d/%d)" % (count, total_len))
            count += 1

合成视频:

 def ascii2video(self):
        # 输出视频保存路径
        savepath = os.path.join(self.outpath, self.outname)
        cmd = 'ffmpeg -threads 2 -start_number 000001 -r 24 -i {0}/%06d.jpeg -vcodec mpeg4 {1}'.format(self.ascii_path,                                                                                             savepath)
        os.system(cmd)

获取原始视频的mp3文件:

def video2mp3(self):
        # mp3名字和保存路径
        name = self.filename.split('.')[0] + '.mp3'
        savepath = os.path.join(self.outpath, name)
        cmd = 'ffmpeg -i {0} -f mp3 {1}'.format(self.filename, savepath)
        os.system(cmd)

将视频和音频合并:

def mp4andmp3(self):
        cmd = 'ffmpeg -i {0} -i {1} -strict -2 -f mp4 {2}'.format(self.mp4filename, self.mp3ilename, self.mergefilename) 
        os.system(cmd)

完整代码:main.py 提取码:ft3r

在这里插入图片描述

五. 总结

  • 欢迎大家尝试更换多种视频。
  • 对本项目感兴趣或者有什么问题的话,欢迎关注非鱼子焉私信探讨。
  • 欢迎大家 喜欢、收藏 、评论。

在这里插入图片描述

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到