脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|shell|

服务器之家 - 脚本之家 - Python - python视频转化字节问题的完整实现

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

2022-12-28 15:02白叔King Python

在Python中可以将视频和字节进行转换,下面这篇文章主要给大家介绍了关于python视频转化字节问题的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下

废话不多说,直接开干!

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

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

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

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

步骤

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

把图片转化为字符画

按顺序播放字符画

1、准备

安装 Python-OpenCV 库

安装 Numpy 科学计算库

用到模块库

?
1
2
3
4
5
6
7
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是尺寸都为指定大小的灰度图。

第一步截取图片

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
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对象为参数,前往对应的字符画

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
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)

第三步字符转视频

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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执行对应的文件

完整代码里面加了

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
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视频转化字节问题的完整实现

总结

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

原文链接:https://blog.csdn.net/weixin_37254196/article/details/124473889

延伸 · 阅读

精彩推荐
  • Pythonpython通过apply使用元祖和列表调用函数实例

    python通过apply使用元祖和列表调用函数实例

    这篇文章主要介绍了python通过apply使用元祖和列表调用函数,实例分析了python中apply方法的使用技巧,需要的朋友可以参考下 ...

    疯狂一夏7312020-07-08
  • PythonPython SDK实现私服上传下载的示例

    Python SDK实现私服上传下载的示例

    本文主要介绍了Python SDK实现私服上传下载的示例,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    王嘉尔学Python9092022-03-10
  • Python搭建python django虚拟环境完整步骤详解

    搭建python django虚拟环境完整步骤详解

    这篇文章主要介绍了搭建python django虚拟环境完整步骤详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友...

    迎风而来3772021-08-04
  • PythonPython采用Django开发自己的博客系统

    Python采用Django开发自己的博客系统

    这篇文章主要为大家详细介绍了Python采用Django开发自己的博客系统,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    Marksinoberg5242020-09-04
  • Pythonpython如何通过protobuf实现rpc

    python如何通过protobuf实现rpc

    这篇文章主要为大家详细介绍了python通过protobuf实现rpc的方法,感兴趣的朋友可以参考一下...

    在于思考3862020-08-15
  • PythonPython学习之str 以及常用的命令

    Python学习之str 以及常用的命令

    下面小编就为大家带来一篇Python的str 以及常用的命令。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    小瑀19873742022-02-21
  • Pythonpython3 实现的人人影视网站自动签到

    python3 实现的人人影视网站自动签到

    这里给大家分享的是使用Python3结合计划任务,实现的人人影视网站自动签到功能的代码,非常的实用,有需要的小伙伴可以参考下...

    黑暗圣堂武士7462020-08-28
  • PythonPython中 map()函数的用法详解

    Python中 map()函数的用法详解

    map( )函数在算法题目里面经常出现,map( )会根据提供的函数对指定序列做映射,在写返回值等需要转换的时候比较常用。这篇文章主要介绍了Python中 map()的...

    KUNLI712992021-03-15