返回顶部
首页 > 资讯 > 后端开发 > Python >python视频转化字节问题的完整实现
  • 237
分享到

python视频转化字节问题的完整实现

2024-04-02 19:04:59 237人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

目录步骤1、准备2. 材料3、按帧读取视频什么是指定要转换的区间、帧率?看下效果图总结废话不多说,直接开干! 抖音字符视频在今年火过一段时间。 反正我是始终忘不了那段刘耕宏老师本草纲

废话不多说,直接开干!

抖音字符视频在今年火过一段时间。

反正我是始终忘不了那段刘耕宏老师本草纲目的音乐…

这一次自己也来实现一波,做一个字符视频出来

百度好多都是显示模块,这个完整实现效果

步骤

将视频转化为一帧一帧的图片

把图片转化为字符画

按顺序播放字符画

1、准备

安装 python-OpenCV

安装 Numpy 科学计算库

用到模块库

import time

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

然后新建Python代码文档,在开头添加上下面的导入语句

2. 材料

材料来个视频文件了,我这里用的是zimeng.mp4,下载下来和代码放到同一目录下

你也可以换成自己的,建议是学习时尽量选个短一点的视频,十几秒十秒就行了,方便调试用

此外,要选择对比度高的视频。否则的话,就需要彩色字符才能有足够好的表现,有时间我试试。

3、按帧读取视频

现在继续添加代码,实现第一步:按帧读取视频。

下面这个函数,接受视频路径和字符视频的尺寸信息,返回一个img列表,其中的img是尺寸都为指定大小的灰度图。

第一步截取图片

def video_img(file='zimeng.mp4'):
    # 在当前目录下新建文件夹
    folder_path = "img_bear/"
    if folder_path:
        pass
    else:
        os.makedirs(folder_path)
    # 进行视频的载入
    vc = cv2.VideoCapture(file)
    # 判断载入的视频是否可以打开
    ret = vc.isOpened()
    # 循环读取视频帧
    num = 0
    while ret:
        num = num + 1
        # 进行单张图片的读取,ret的值为True或者Flase,frame表示读入的图片
        ret, frame = vc.read()
        if ret:
            # 存储为图像
            cv2.imwrite('img_bear/' + str(num) + '.jpg', frame)
            # 输出图像名称
            print('img_bear/' + str(num) + '.jpg')
            # 在一个给定的时间内(单位ms)等待用户按键触发,1ms
            cv2.waiTKEy(1)
        else:
            break
    # 视频释放
    vc.release()
    time.sleep(0.5)
    video_image(num)

如果运行没报错,就没问题

代码里的注释应该写得很清晰了,继续下一步

第二步对图片做灰度处理

视频转换成了图像,这一步便是把图像转换成字符画

上面这个函数,一个img对象为参数,前往对应的字符画

def video_image(num=''):
    # 创建字符图片文件夹
    folder_path = "bear/"
    if folder_path:
        pass
    else:
        os.makedirs(folder_path)
    for i in range(1, num):
        filename = 'img_bear/' + str(i) + '.jpg'
        im = Image.open(filename)  # 返回一个Image对象
        width = im.size[0]
        heigth = im.size[1]
        print('宽:%d,高:%d' % (im.size[0], im.size[1]))
        # 字符列表
        ascii_char = list("$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~            <>i!lI;:,\"^`'. ")
        # 判断图片是否存在
        if os.path.exists(filename):
            # 将图片转化为灰度图像,并重设大小
            img_array = np.array(Image.open(filename).resize((160, 160), Image.ANTIALIAS).convert('L'))
            # 创建新的图片对象
            img = Image.new('L', (width, heigth), 255)
            draw_object = ImageDraw.Draw(img)
            # 设置字体
            font = ImageFont.truetype('consola.ttf', 10, encoding='unic')
            # 根据灰度值添加对应的字符
            for j in range(160):
                for k in range(160):
                    x, y = k * 8, j * 8
                    index = int(img_array[j][k] / 4)
                    draw_object.text((x, y), ascii_char[index], font=font, fill=0)
            name = 'bear/' + str(i) + '.jpg'
            print(name)
            # 保存字符图片
            img.save(name, 'JPEG')
    time.sleep(0.5)
    video(num)

第三步字符转视频

写了这么多代码,如今终于要出效果了。如今就是最激动人心的一步:播放字符画了。

异样的,我把它封装成了一个函数。上面这个函数承受一个字符画的列表并播放。

def video(num):
    filename = 'img_bear/' + str(1) + '.jpg'
    im = Image.open(filename)  # 返回一个Image对象
    width = im.size[0]
    heigth = im.size[1]
    # 设置视频编码器,这里使用使用MJPG编码器
    fourcc = cv2.VideoWriter_fourcc(*'MJPG')
    # 输出视频参数设置,包含视频文件名、编码器、帧率、视频宽高(此处参数需和字符图片大小一致)
    videoWriter = cv2.VideoWriter('bear_character.avi', fourcc, 20.0, (width, heigth))

    for i in range(1, num):
        filename = 'bear/'+str(i)+'.jpg'
        # 判断图片是否存在
        if os.path.exists(filename):
            img = cv2.imread(filename=filename)
            # 在一个给定的时间内(单位ms)等待用户按键触发,100ms
            cv2.waitKey(100)
            # 将图片写入视频中
            videoWriter.write(img)
            print(str(i) + '.jpg' + ' done!')
    # 视频释放
    videoWriter.release()
    time.sleep(1)
    # 删除图片
    remove_img()
    remove_img_bear()

下面完整代码

可能要等很久。我使用示例视频大概需要 500 秒左右。

ctrl+f10执行对应的文件

完整代码里面加了

执行生成图片,生成灰度图片,最后通过灰度生成字节视频删除多余文件

说了那太多废话就是:最后还需删除一些临时的文件及文件夹。

import time

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

# 第一步截取图片
def video_img(file='zimeng.mp4'):
    # 在当前目录下新建文件夹
    folder_path = "img_bear/"
    if folder_path:
        pass
    else:
        os.makedirs(folder_path)
    # 进行视频的载入
    vc = cv2.VideoCapture(file)
    # 判断载入的视频是否可以打开
    ret = vc.isOpened()
    # 循环读取视频帧
    num = 0
    while ret:
        num = num + 1
        # 进行单张图片的读取,ret的值为True或者Flase,frame表示读入的图片
        ret, frame = vc.read()
        if ret:
            # 存储为图像
            cv2.imwrite('img_bear/' + str(num) + '.jpg', frame)
            # 输出图像名称
            print('img_bear/' + str(num) + '.jpg')
            # 在一个给定的时间内(单位ms)等待用户按键触发,1ms
            cv2.waitKey(1)
        else:
            break
    # 视频释放
    vc.release()
    time.sleep(0.5)
    video_image(num)
# 第二步对图片做灰度处理
def video_image(num=''):
    # 创建字符图片文件夹
    folder_path = "bear/"
    if folder_path:
        pass
    else:
        os.makedirs(folder_path)
    for i in range(1, num):
        filename = 'img_bear/' + str(i) + '.jpg'
        im = Image.open(filename)  # 返回一个Image对象
        width = im.size[0]
        heigth = im.size[1]
        print('宽:%d,高:%d' % (im.size[0], im.size[1]))
        # 此字符表用于生字符帧,对应256个像素,字符越多且不同样式,字符帧越精细
        ascii_char = list("$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~            <>i!lI;:,\"^`'. ")
        # 判断图片是否存在
        if os.path.exists(filename):
            # 将图片转化为灰度图像,并重设大小
            img_array = np.array(Image.open(filename).resize((160, 160), Image.ANTIALIAS).convert('L'))
            # 创建新的图片对象
            img = Image.new('L', (width, heigth), 255)
            draw_object = ImageDraw.Draw(img)
            # 设置字体
            font = ImageFont.truetype('consola.ttf', 10, encoding='unic')
            # 根据灰度值添加对应的字符
            for j in range(160):
                for k in range(160):
                    x, y = k * 8, j * 8
                    index = int(img_array[j][k] / 4)
                    draw_object.text((x, y), ascii_char[index], font=font, fill=0)
            name = 'bear/' + str(i) + '.jpg'
            print(name)
            # 保存字符图片
            img.save(name, 'JPEG')
    time.sleep(0.5)
    video(num)
# 第三步字符转视频

def video(num):
    filename = 'img_bear/' + str(1) + '.jpg'
    im = Image.open(filename)  # 返回一个Image对象
    width = im.size[0]
    heigth = im.size[1]
    # 设置视频编码器,这里使用使用MJPG编码器
    fourcc = cv2.VideoWriter_fourcc(*'MJPG')
    # 输出视频参数设置,包含视频文件名、编码器、帧率、视频宽高(此处参数需和字符图片大小一致)
    videoWriter = cv2.VideoWriter('bear_character.avi', fourcc, 20.0, (width, heigth))

    for i in range(1, num):
        filename = 'bear/'+str(i)+'.jpg'
        # 判断图片是否存在
        if os.path.exists(filename):
            img = cv2.imread(filename=filename)
            # 在一个给定的时间内(单位ms)等待用户按键触发,100ms
            cv2.waitKey(100)
            # 将图片写入视频中
            videoWriter.write(img)
            print(str(i) + '.jpg' + ' done!')
    # 视频释放
    videoWriter.release()
    time.sleep(1)
    # 删除图片
    remove_img()
    remove_img_bear()
# 原图片删除
def remove_img():
    files = os.getcwd()  # files中保存的是当前的执行目录
    file_name = files + "/img_bear"
    del_list = os.listdir(file_name)
    for f in del_list:
        file_path = os.path.join(file_name, f)
        print(file_path)
        if os.path.isfile(file_path):
            os.remove(file_path)
            print('成功删除文件:')
        else:
            print('未找到此文件:')
# 灰度图片删除
def remove_img_bear():
    files = os.getcwd()  # files中保存的是当前的执行目录
    file_name = files + "/bear"
    del_list = os.listdir(file_name)
    for f in del_list:
        file_path = os.path.join(file_name, f)
        print(file_path)
        if os.path.isfile(file_path):
            os.remove(file_path)
            print('成功删除文件:')
        else:
            print('未找到此文件:')
def main():
    video_img('video.mp4')


if __name__ == "__main__":
    main()

进一步优化

到了这里,核心功能基本都完成了。

不过仔细想想,其实还有很多可以做的:

什么是指定要转换的区间、帧率?

每次转换都要很久的时间,能不能边转换边播放?或者转换后把数据保存起来,下次播放时,就直接读缓存

看下效果图

总结

到此这篇关于python视频转化字节问题的文章就介绍到这了,更多相关python视频转化字节内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: python视频转化字节问题的完整实现

本文链接: https://lsjlt.com/news/117905.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • python视频转化字节问题的完整实现
    目录步骤1、准备2. 材料3、按帧读取视频什么是指定要转换的区间、帧率?看下效果图总结废话不多说,直接开干! 抖音字符视频在今年火过一段时间。 反正我是始终忘不了那段刘耕宏老师本草纲...
    99+
    2024-04-02
  • python视频转化字节问题怎么解决
    本文小编为大家详细介绍“python视频转化字节问题怎么解决”,内容详细,步骤清晰,细节处理妥当,希望这篇“python视频转化字节问题怎么解决”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。步骤将视频转化为一帧一...
    99+
    2023-06-30
  • Python实现地图可视化folium完整过程
    目录Folium简介1.安装folium模块2.安装jupyter3.查看世界地图4.查看中国地图5.武汉市地图6.添加标记7.查找武汉科技大学8.未解决9.参考文章Folium简介...
    99+
    2024-04-02
  • Python如何实现视频转换为字符画
    这篇文章给大家分享的是有关Python如何实现视频转换为字符画的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。首先读取视频,并转为字符。视频是从B站下载的,地址《激战江南》穿山甲名场面。由于B站直接下载的视频为fl...
    99+
    2023-06-22
  • Python实现视频转换为字符画详解
    上次写了个华强买瓜字符视频的帖子,下面有人问如何保存,所以这次就写一个能将字符画视频保存下来的帖子,然而时不待我,华强纪元已经结束,现在是穿山甲的时代了。 首先读取视频,并转为字符。...
    99+
    2024-04-02
  • 基于Python实现视频转字符画动漫小工具
    目录导语正文一、准备中二、原理简介三、代码演示四、效果展示导语 ​哈喽!boys and  girls 我是每天疯狂赶代码的木木子~ 今天带大家来点儿好玩儿的东西,我想你们肯定是喜欢...
    99+
    2024-04-02
  • Python生成字符视频的实现示例
    一、前言 在之前也写过生成字符视频的文章,但是使用的是命令行窗口输出,效果不是很好,而且存在卡顿的情况。于是我打算直接生成一个mp4的字符视频。大致思路和之前一样:Python20行代码实现视频字符化。 下面来看一个...
    99+
    2022-06-02
    Python生成字符视频 Python 字符视频
  • Python实现图片和视频的相互转换
    目录使用背景一、视频转图像二、图像转视频使用背景 有时候我们需要把很多的图片合成视频,或者说自己写一个脚本去加快或者放慢视频; 也有时候需要把视频裁剪成图片,进行后续操作。 这里提供...
    99+
    2024-04-02
  • python实现棋盘覆盖问题及可视化
    问题介绍 棋盘覆盖问题,是一种编程问题。 如何应用分治法求解棋盘覆盖问题呢?分治的技巧在于如何划分棋盘,使划分后的子棋盘的大小相同,并且每个子棋盘均包含一个特殊方格,从而将原问题分...
    99+
    2024-04-02
  • Python怎么实现批量转换视频音频的采样率
    这篇文章主要讲解了“Python怎么实现批量转换视频音频的采样率”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python怎么实现批量转换视频音频的采样率”吧!环境依赖ffmpeg环境安装f...
    99+
    2023-06-21
  • Python 如何实现批量转换视频音频的采样率
    目录前言环境依赖代码验证一下前言 本文主要分享一个python代码,可以将多个视频中的音频转化为相同采样率的视频。对视频格式的校验没有做,也不是很关键。 环境依赖 ffmpeg环境安...
    99+
    2024-04-02
  • 基于Python如何实现视频转字符画动漫小工具
    本篇文章给大家分享的是有关基于Python如何实现视频转字符画动漫小工具,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。导语今天带大家来点儿好玩儿的东西,我想你们肯定是喜欢的!上...
    99+
    2023-06-22
  • Python怎么实现图片和视频的相互转换
    本篇内容主要讲解“Python怎么实现图片和视频的相互转换”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python怎么实现图片和视频的相互转换”吧!使用背景有时候我们需要把很多的图片合成视频,...
    99+
    2023-06-22
  • python怎么实现棋盘覆盖问题及可视化
    这篇文章主要介绍“python怎么实现棋盘覆盖问题及可视化”,在日常操作中,相信很多人在python怎么实现棋盘覆盖问题及可视化问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”python怎么实现棋盘覆盖问题及...
    99+
    2023-06-13
  • 浅谈Python列表嵌套字典转化的问题
    在看视频教程的时候提到了[{'a' : 97}, {'b' : 98}, {'c' : 99}, {'d' : 100}, {'e' : 101}, ...........]形式的列...
    99+
    2024-04-02
  • Python+selenium 自动化快手短视频发布的实现过程
    第一章:效果展示 ① 效果展示 ② 素材展示 一个为视频,另一个为像素大小不小于视频的封面。 第二章:实现过程 ① 调用已启用的浏览器 通过调用已启用的浏览器,可以实现直接跳过每...
    99+
    2024-04-02
  • Python处理json字符串转化为字典的简单实现
    今天一个朋友给个需求: 来来 {'isOK': 1, 'isRunning': None, 'isError': None} 怎么转换成字典 好,一看就是json转化很简单,开始: import ...
    99+
    2022-06-04
    转化为 字符串 字典
  • 详解Python数据类型、进制转换、字符串格式化的问题
    目录1. 整数、浮点数和复数浮点数Decimal复数2.进制转换进制数字类型整型进制操作3. 字符串3.1 转义字符3.2 字符串取值4. 字符串运算与转换5. 字符串的常用方法判断...
    99+
    2024-04-02
  • 聊聊python中的load、loads实现反序列化的问题
    load与loads 简介: 在python自动化中,我们传递一些参数是需要从文件中读取过来的,读取过来的字典并非python对象数据类型而是string类型。 这样在我们传递参数的...
    99+
    2024-04-02
  • 基于pdf2docx模块Python实现批量将PDF转Word文档的完整代码教程
    PDF文件是一种常见的文档格式,但是在编辑和修改时不太方便,因为PDF本质上是一种静态的文档格式。 因此,有时候我们需要将PDF文件转换成Word格式,以便更好地编辑和修改文档。在本...
    99+
    2023-05-15
    pdf2docx模块 Python PDF Python PDF转Word
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作