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

2023-05-16

目录

  • 一. 前言
  • 二. 项目简介
  • 三. 基本要求
  • 四. 代码实现
    • 4.1 安装ffmpeg.exe
    • 4.2 安装you-get库
      • 4.2.1 下载
      • 4.2.2 检查视频信息
      • 4.2.3 下载 mp3 格式视频
    • 4.3 执行代码
  • 五. 总结

一. 前言

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

二. 项目简介

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

  • 基于win11环境,python3.7版本
  • 项目中用到了ffmpeg.exe 用于编辑视频
    下载地址:ffmpeg-N-102841-g041267b558-win64-lgpl-shared
    提取码:xg9n

三. 基本要求

  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

在这里插入图片描述

五. 总结

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

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • ASP .Net Core内置 Identity 简介 使用

    一 简介 1 概况 ASP NET Core Identity是一个成员身份系统 xff0c 可将用户注册和登录功能添加到 ASP NET Core Web UI 成员身份系统处理身份验证和授权问题 身份验证涉及你的身份 授权涉及允许你进行
  • sql 2008 安装失败 mof语法错误 处理

    这几天比较忧闷 xff0c 在一台比较老的win2003机器上安装sql2008一直出 MOF语法错误 安装失败 xff0c 浪费了我几天的时间才搞定 现把经历写出来以帮他人可以少走歪路 这台机器是一个平时当开发平台的机器 xff0c AM
  • 十年老撕鸡分享,五分钟搭建个人轻论坛

    点击 关注 爪哇笔记 给公众号标星置顶 更多精彩 第一时间直达 前言 09 年开始接触论坛 xff0c 那会微信还没有诞生 xff0c 也没有什么移动互联网 xff0c 大家还都在用功能机玩着 2G 的文字游戏 xff01 那会玩论坛的还比
  • sql server之在存储过程中利用OpenJson将Json字符串转化为表格

    在Sql server2016的版本后 xff0c 数据库增加了对Json格式的支持 xff0c 详细信息可以参考微软官方文档链接 应用背景 在线订餐系统中 xff0c 购物车的内容存储在浏览器缓存中 所以数据库关于订单的设计是订单表 xf
  • 生活大爆炸版 石头剪刀布

    如果大家认为写的不错 xff0c 请点赞关注收藏 xff01 题目描述 石头剪刀布是常见的猜拳游戏 xff1a 石头胜剪刀 xff0c 剪刀胜布 xff0c 布胜石头 如果两个人出拳一 样 xff0c 则不分胜负 在 生活大爆炸 第二季第8
  • debian10安装docker

    使用root登录 将已安装的软件包更新到最新版本 xff1a apt update apt upgrade 安装通过 HTTPS 添加新存储库所需的依赖项 xff1a apt install apt transport https ca c
  • 黑盒(功能)测试以及测试用例设计

    概念 xff1a 黑盒测试是把测试对象看做一个黑盒子 xff0c 利用黑盒测试法进行动态测试时 xff0c 需要测试软件产品已经实现的功能是否符合功能设计要求 xff0c 不需测试软件产品的内部结构和处理过程 黑盒测试注重于测试软件的功能性
  • 2018.09.27 网络协议(tarjan)

    描述 一些学校连接在一个计算机网络上 学校之间存在软件支援协议 每个学校都有它应支援的学校名单 xff08 学校 a 支援学校 b xff0c 并不表示学校 b 一定支援学校 a xff09 当某校获得一个新软件时 xff0c 无论是直接得
  • golang exec 执行 shell 如何同步输出/得到执行结果

    背景 项目中需要执行shell命令 xff0c 虽然exec包提供了CombinedOutput 方法 xff0c 在shell运行结束会返回shell执行的输出 xff0c 但是用户在发起一次任务时 xff0c 可能在不停的刷新log x
  • Android下USB的虚拟串口功能

    1 先关闭usb的gadge功能 echo 0 gt sys class android usb android0 enable 2 设置acm transports为 34 TTY 34 的功能 echo 34 TTY 34 gt sys
  • ubuntu鼠标灵敏度设置

    ubuntu鼠标灵敏度设置 安装ubuntu以后使用系统鼠标灵敏度设置总觉得不太管用 xff0c 于是各方搜索 xff0c 最终找到一个有效的解决方案 具体命令如下 xff1a span class hljs built in sudo s
  • Win10安装Anaconda和TensorFlow

    Anaconda与TensorFlow Anaconda是一个开源的Python发行版本 包含了很多科学包 Tensorflow是谷歌近几年发行的机器学习框架 安装过程 Anaconda安装 其安装过程简单 Anaconda安装成功测试卸载
  • Navicat报错2003:can't connect to MySQl server on localhost

    好久没用Navicat来操作Mysql 今天一用出现错误 解决方法 控制面板 大图标 管理工具 服务 MYSQL启动
  • vscode编辑c++报错undefined reference to `Point::setY(int)‘ collect2.exe: error: ld returned 1 exit statu

    提示 xff1a 文章写完后 xff0c 目录可以自动生成 xff0c 如何生成可参考右边的帮助文档 64 TOC 文vscode编辑c 43 43 报错undefined reference to 96 Point setY int co
  • 解决RuntimeError: Expected all tensors to be on the same device, but found at least two devices,

    问题描述 说明网络中有的数据在gpu运算有的在cpu运算 解决方法 报错的行加上 cuda 即可 参考 https www cnblogs com tanyahuang p 15522833 html
  • 线性表 顺序存储 C语言实现

    线性表 顺序存储 C语言实现 关于线性表8个基本操作的c语言实现 注意 顺序表用数组表示 线性表位序从1开始 数组元素下标从0开始 顺序表插入删除 判断插入 删除位置是否合法的表示方法 include lt stdio h gt SqLis
  • 百度飞桨:春节写春联:你写上联,AI写下联

    写春联 xff1a 你写上联 xff0c AI写下联 一 前言二 项目简介三 基本要求四 代码实现五 项目成果六 总结 百度飞桨系列文章 xff1a 百度飞桨 xff1a 给出关键词 xff0c AI自动生成元宵节祝福 百度飞桨 xff1a
  • 百度飞桨:(情人节特辑)想做就做,让爱豆对你说情话,过凡尔赛式情人节~

    想做就做 xff0c 让爱豆对你说情话 xff0c 过凡尔赛式情人节 xff01 一 前言二 项目简介三 代码实现四 项目成果五 总结 百度飞桨系列文章 xff1a 百度飞桨 xff1a 春节写春联 xff1a 你写上联 xff0c AI写
  • ECS的概念

    服务器的部署模式发展历程 单机架构 xff1a 一台服务器提供给客户所有应用 缺点 xff1a 单机架构要求服务器的性能非常强大纵向扩展 xff1a 换高主频的CPU xff0c 增大CPU xff0c 增大内存纵向扩展的缺陷 xff1a
  • Python基础详解(十三):(视频符号化)将视频转换成ASCII符号形式展示出来

    目录 一 前言二 项目简介三 基本要求四 代码实现4 1 安装ffmpeg exe4 2 安装you get库4 2 1 下载4 2 2 检查视频信息4 2 3 下载 mp3 格式视频 4 3 执行代码 五 总结 一 前言 今天手把手教大家