当前位置:   article > 正文

python 视频转代码视频_python.txt2image

python.txt2image

 

  1. # -*- coding:utf-8 -*-
  2. #coding:utf-8
  3. import argparse
  4. import os
  5. import cv2
  6. import subprocess
  7. from cv2 import VideoWriter, VideoWriter_fourcc, imread, resize
  8. from PIL import Image, ImageFont, ImageDraw
  9. # 命令行输入参数处理
  10. # aparser = argparse.ArgumentParser()
  11. # aparser.add_argument('file')
  12. # aparser.add_argument('-o','--output')
  13. # aparser.add_argument('-f','--fps',type = float, default = 24)#帧
  14. # aparser.add_argument('-s','--save',type = bool, nargs='?', default = False, const = True)
  15. # 是否保留Cache文件,默认不保存
  16. # 获取参数
  17. # args = parser.parse_args()
  18. # INPUT = args.file
  19. # OUTPUT = args.output
  20. # SAVE = args.save
  21. # FPS = args.fps
  22. # 像素对应ascii码
  23. ascii_char = list("$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:oa+>!:+. ")
  24. # ascii_char = list("MNHQ$OC67+>!:-. ")
  25. # ascii_char = list("MNHQ$OC67)oa+>!:+. ")
  26. # 将像素转换为ascii码
  27. def get_char(r, g, b, alpha=256):
  28. if alpha == 0:
  29. return ''
  30. length = len(ascii_char)
  31. gray = int(0.2126 * r + 0.7152 * g + 0.0722 * b)
  32. unit = (256.0 + 1) / length
  33. return ascii_char[int(gray / unit)]
  34. # 将txt转换为图片
  35. def txt2image(file_name):
  36. im = Image.open(file_name).convert('RGB')
  37. # gif拆分后的图像,需要转换,否则报错,由于gif分割后保存的是索引颜色
  38. raw_width = im.width
  39. raw_height = im.height
  40. width = int(raw_width / 6)
  41. height = int(raw_height / 15)
  42. im = im.resize((width, height), Image.NEAREST)
  43. txt = ""
  44. colors = []
  45. for i in range(height):
  46. for j in range(width):
  47. pixel = im.getpixel((j, i))
  48. colors.append((pixel[0], pixel[1], pixel[2]))
  49. if (len(pixel) == 4):
  50. txt += get_char(pixel[0], pixel[1], pixel[2], pixel[3])
  51. else:
  52. txt += get_char(pixel[0], pixel[1], pixel[2])
  53. txt += '\n'
  54. colors.append((255, 255, 255))
  55. im_txt = Image.new("RGB", (raw_width, raw_height), (255, 255, 255))
  56. dr = ImageDraw.Draw(im_txt)
  57. # font = ImageFont.truetype(os.path.join("fonts","汉仪楷体简.ttf"),18)
  58. font = ImageFont.load_default().font
  59. x = y = 0
  60. # 获取字体的宽高
  61. font_w, font_h = font.getsize(txt[1])
  62. font_h *= 1.37 # 调整后更佳
  63. # ImageDraw为每个ascii码进行上色
  64. for i in range(len(txt)):
  65. if (txt[i] == '\n'):
  66. x += font_h
  67. y = -font_w
  68. # self, xy, text, fill = None, font = None, anchor = None,
  69. #*args, ** kwargs
  70. dr.text((y, x), txt[i], fill=colors[i])
  71. #dr.text((y, x), txt[i], font=font, fill=colors[i])
  72. y += font_w
  73. name = file_name
  74. #print(name + ' changed')
  75. im_txt.save(name)
  76. # 将视频拆分成图片
  77. def video2txt_jpg(file_name):
  78. vc = cv2.VideoCapture(file_name)
  79. c = 1
  80. if vc.isOpened():
  81. r, frame = vc.read()
  82. if not os.path.exists('Cache'):
  83. os.mkdir('Cache')
  84. os.chdir('Cache')
  85. else:
  86. r = False
  87. while r:
  88. cv2.imwrite(str(c) + '.jpg', frame)
  89. txt2image(str(c) + '.jpg') # 同时转换为ascii图
  90. r, frame = vc.read()
  91. c += 1
  92. os.chdir('..')
  93. return vc
  94. # 将图片合成视频
  95. def jpg2video(outfile_name, fps):
  96. fourcc = VideoWriter_fourcc(*"MJPG")
  97. images = os.listdir('Cache')
  98. im = Image.open('Cache/' + images[0])
  99. vw = cv2.VideoWriter(outfile_name + '.avi', fourcc, fps, im.size)
  100. os.chdir('Cache')
  101. for image in range(len(images)):
  102. # Image.open(str(image)+'.jpg').convert("RGB").save(str(image)+'.jpg')
  103. frame = cv2.imread(str(image + 1) + '.jpg')
  104. vw.write(frame)
  105. #print(str(image + 1) + '.jpg' + ' finished')
  106. os.chdir('..')
  107. vw.release()
  108. # 递归删除目录
  109. def remove_dir(path):
  110. if os.path.exists(path):
  111. if os.path.isdir(path):
  112. dirs = os.listdir(path)
  113. for d in dirs:
  114. if os.path.isdir(path + '/' + d):
  115. remove_dir(path + '/' + d)
  116. elif os.path.isfile(path + '/' + d):
  117. os.remove(path + '/' + d)
  118. os.rmdir(path)
  119. return
  120. elif os.path.isfile(path):
  121. os.remove(path)
  122. return
  123. # 调用ffmpeg获取mp3音频文件
  124. def video2mp3(file_name):
  125. outfile_name = file_name.split('.')[0] + '.mp3'
  126. subprocess.call('ffmpeg -i ' + file_name + ' -f mp3 ' + outfile_name, shell=True)
  127. # 合成音频和视频文件
  128. def video_add_mp3(file_name, mp3_file):
  129. outfile_name = file_name.split('.')[0] + '-txt.mp4'
  130. subprocess.call('ffmpeg -i ' + file_name + ' -i ' + mp3_file + ' -strict -2 -f mp4 ' + outfile_name, shell=True)
  131. if __name__ == '__main__':
  132. INPUT = r"G:\py\学习python\视频到代码\video39.mp4"
  133. OUTPUT = r"G:\py\学习python\视频到代码\video39_2.mp4"
  134. SAVE = r"G:\py\学习python\视频到代码\\video39_3"
  135. FPS = "24"
  136. vc = video2txt_jpg(INPUT)
  137. FPS = vc.get(cv2.CAP_PROP_FPS) # 获取帧率
  138. print(FPS)
  139. vc.release()
  140. jpg2video(INPUT.split('.')[0], FPS)
  141. print(INPUT, INPUT.split('.')[0] + '.mp3')
  142. video2mp3(INPUT)
  143. video_add_mp3(INPUT.split('.')[0] + '.avi', INPUT.split('.')[0] + '.mp3')
  144. if (not SAVE):
  145. remove_dir("Cache")
  146. os.remove(INPUT.split('.')[0] + '.mp3')
  147. os.remove(INPUT.split('.')[0] + '.avi')

流程图

这次python编程的流程图如下: 
这里写图片描述




注意事项

在编程的过程中有需要注意的几点:

  • 这次编程使用到了opencv库,需要安装

  • 帧率的获取可以通过这个函数——FPS = vc.get(cv2.CAP_PROP_FPS)

  • 合成后的视频是没有声音的,我们使用ffmpeg进行合成

---------------------------

2021年12月17日17:25:39

非常高兴大家能喜欢这个博客(有手的帮忙下面点个赞再往下看)

但是some body 总是运行不起来。(一个计算机小白某大学生妹子)

我觉得是open cv没有装好

于是乎。我趁着升级python310 把所有环境都清楚了。

叫你们如何装opencv 以及 其他的需要的插件

安装cv2方案1

访问 https://www.lfd.uci.edu/~gohlke/pythonlibs/#opencv

 根据我的电脑是w10 python版本310 而且还是64位系统的amd系统。

所以选这个下载
 

下不下来?

复制地址去迅雷下载

安装方法非常的朴素

pip install 刚才下载的whl文件路径

速度非常快啊。一下就安装好了。。因为下载好了。。

安装cv2方案2

pip install opencv-python

继续运行项目。代码放进了main.py

这里仅仅保留

 a.mp4 是一个带声音的英雄联盟的武打片 2分钟52s 文件比较大 元素比较多

需要耐心等下进度

执行代码

哎呀报错了

import cv2 ImportError: numpy.core.multiarray failed to import

 原来是这样。。需要安装numpy

对不住了各位。。之前教程没写好。我有罪。给我点个赞原谅我一下 呜呜呜

pip install numpy

之后代码会执行。这里会生成缓存文件

看缩略图非常的漂亮。由于我的视频比较大。

我准备把他运行完成。然后看下效果 

 在经历了漫长的2594个后

程序不再生成图片了而是生成了

a.avi这个是纯图片不带声音的输出

代码还在执行

请耐心给他点时间

 

 执行完毕后会有a.mp3和a-txt.mp4两个文件

这分别是分离出来的音频文件和合成后的视频文件 

a.txt.mp4是最终输出文件

出现这个才是执行完成

exit code 0

然后

原视频地址:视屏生成代码源文件_哔哩哔哩bilibili

生成视频地址:视频去哪了呢?_哔哩哔哩_bilibili

你可能会觉得视频效果并不是很好。

但是如果换成建议的动漫或者元素比较少的视频

生成的效果是非常棒的。

更新时间 2021年12月17日18:34:02

点个赞兄弟。都看到这里了

#博客地址
https://blog.csdn.net/mp624183768/article/details/81161260
#git地址
https://gitee.com/liuande/python_video_to_code_video
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/775983
推荐阅读
相关标签
  

闽ICP备14008679号