【Python 字符视频】Python 实现将抖音视频转换成字符视频

article/2025/9/21 16:37:00

以前就在抖音上看到过字符视频,直到昨天才突然想自己动手做一个,然后就利用各种博客,自己总结 兼 借鉴,终于完成了字符视频的制作

一、思路:
众所周知,视频是一帧一帧的图片组成的,所以我想的就是将抖音的视频先解析成好多帧图片,然后对图片进行操作,最后再把图片合成视频

二、遇到的问题:

  1. 其中我遇到的最大问题就是 pycharm 的 BUG,我从来没有想过 pycharm 会有 BUG,所以在我安装 opencv-python 库的时候,我一直以为是我的安装错误,可最后翻阅了超多博客后,才下定结论是 pycharm 的 BUG,并且代码验证确实可以运行,所以石锤了。

    错误显示:

    Cannot find reference 'waitKey' in '__init__.py' less... (Ctrl+F1) 
    Inspection info: This inspection detects names that should resolve but don't. Due to dynamic dispatch and duck typing, this is possible in a limited but useful number of cases. Top-level and class-level items are supported better than instance items.
    

    这个错误可以忽略,因为这是 pycharm 本身的 BUG,不影响代码运行

  2. 视频格式错误
    从抖音上下载的视频格式显示是 .Mp4 ,可是并不能用,所以需要转换编码,网上有很多免费的在线转格式的网站。

三、具体操作步骤

  1. 转换视频格式
    在抖音上下载的视频是无法直接转换的,所以需要将视频转码:->免费转码网站<-,转成原来的格式,即还是 .Mp4 就足够了
  2. 首先是要将视频中的帧提取出来:
    部分代码如下:
    while ret:# 进行单张图片的读取,ret的值为True或者Flase,frame表示读入的图片ret, frame = vc.read()if ret:# 存储为图像cv2.imwrite(folder_path + str(c) + '.jpg', frame)# 输出图像名称#print(folder_path + str(c) + '.jpg')c = c + 1# 在一个给定的时间内(单位ms)等待用户按键触发,1mscv2.waitKey(1)else:break
    
  3. 其次就是单独处理每个图片(也是最复杂的)
    部分代码如下:
    for j in range(len(txts)):for i in range(len(txts[j])):if isgray:draw_handle.text((i*block_x, j*block_y), txts[j][i], (50, 50, 50))else:draw_handle.text((i*block_x, j*block_y), txts[j][i], colors[j][i])
    
    整体思路:读出旧图片,新建一个Image对象,基于旧图片,构造新图片
    具体思路:采用多线程来读出旧图片(因为单线程实在太慢了),自定义字体格式,获取此格式的一个字符的长宽,获取旧图片的长宽,新建一个图片对象,新图片的长宽为:(旧图片长宽 / 字体格式一个字符的长宽),相当于对图片进行了缩放,将每一个字体格式的字符,缩为新图片的一个像素,在扫描就图片的时候,记录下 RGB,并计算出字符,随后填入新图片。
  4. 最后合成视频
    部分代码如下:
    for i in range(1, 1000):filename = folder_path_char + str(i) + '.jpg'# 判断图片是否存在if os.path.exists(filename):img = cv2.imread(filename=filename)# 在一个给定的时间内(单位ms)等待用户按键触发,100mscv2.waitKey(100)# 将图片写入视频中videoWriter.write(img)# print(str(i) + '.jpg' + ' done!')
    
  5. 提取原视频 Mp3
    这里有一个网站:->Mp3提取网站<-,可以提取出视频的 Mp3
  6. 合成
    我用的是一个视频编辑软件,加入了音频 Mp3,并且压缩了视频(因为合成的视频太大了,抖音 2 M 的视频,合成后变成了 200 M)

四、详细代码

from PIL import Image, ImageDraw, ImageFont
import cv2
import os
import threading
ascii_char = list("$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,\"^`'. ")#在当前目录下新建文件夹
folder_path = r"D:\Python_workspace\char_video_sources\pictures\\"#每帧
folder_path_char =r"D:\Python_workspace\char_video_sources\char_pitcures\\"#彩色字符帧width=None
height=None
fps=None
count=None
def getVideo(url):# 进行视频的载入vc = cv2.VideoCapture(url)c = 0# 判断载入的视频是否可以打开ret = vc.isOpened()"""获取视频参数"""global fpsfps=vc.get(cv2.CAP_PROP_FPS)#获取视频帧速global countcount=vc.get(cv2.CAP_PROP_FRAME_COUNT)#获取视频帧数global widthglobal heightwidth =int(vc.get(cv2.CAP_PROP_FRAME_WIDTH))  # 获取长宽height =int(vc.get(cv2.CAP_PROP_FRAME_HEIGHT))"""end"""# 循环读取视频帧while ret:# 进行单张图片的读取,ret的值为True或者Flase,frame表示读入的图片ret, frame = vc.read()if ret:# 存储为图像cv2.imwrite(folder_path + str(c) + '.jpg', frame)# 输出图像名称#print(folder_path + str(c) + '.jpg')c = c + 1# 在一个给定的时间内(单位ms)等待用户按键触发,1mscv2.waitKey(1)else:breakvc.release()def get_char(r,g,b,alpha = 256):#获取对应的字符if alpha == 0:return ' 'length = len(ascii_char)gray = int(0.2126 * r + 0.7152 * g + 0.0722 * b)unit = (256.0 + 1)/lengthreturn ascii_char[int(gray/unit)]def severalThreadings(isgray=False):#多线程处理灰度图像lines=5eachPice=int(count/lines)#每个线程所需处理帧数threads=[]for line in range(lines):#对于一片进行处理,然后计算扩展到begin=line*eachPiceend=(line+1)*eachPiceif line==lines-1:#如果是最后一个线程,则其工作为收尾工作,将图片进行到最后end=int(count)thread = threading.Thread(target=getCharPitcure, args=(begin,end,isgray))threads.append(thread)thread.setDaemon(True)thread.start()for item in threads:item.join()def getCharPitcure(begin=0,end=count,isgray=False):#传入是否生成灰色,默认为否for op in range(begin, end):#print("这是第{}个".format(op))img = folder_path + str(op) + '.jpg'# print(img)if os.path.exists(img):im = Image.open(img).convert('RGB') # 注意,此处需要先将图片转换为RGB模式# 设定处理后的字符画大小,需要为整型raw_width = int(im.width)raw_height = int(im.height)# 获取设定的字体的尺寸,ImageFont默认的尺寸大小为6x11,其他字体会有所不同# 此处使用的字体为truetype字体,大小为10pxfont = ImageFont.truetype('consola.ttf', 10, encoding='unic')font_x, font_y = font.getsize(' ')# 确定单元的大小block_x = int(font_x)block_y = int(font_y)# 确定长宽各有几个单元w = int(raw_width/block_x)h = int(raw_height/block_y)# 将每个单元缩小为一个像素im = im.resize((w, h), Image.NEAREST)# txts和colors分别存储对应块的ASCII字符和RGB值txts = []colors = []for i in range(h):#遍历行line = ''lineColor = []for j in range(w):#遍历列pixel = im.getpixel((j, i))lineColor.append((pixel[0], pixel[1], pixel[2]))line += get_char(pixel[0], pixel[1], pixel[2])txts.append(line)colors.append(lineColor)# 创建新画布im_txt = Image.new("RGB", (raw_width, raw_height), (255, 255, 255))# 创建ImageDraw对象以写入ASCIIdraw_handle = ImageDraw.Draw(im_txt)for j in range(len(txts)):for i in range(len(txts[j])):if isgray:draw_handle.text((i*block_x, j*block_y), txts[j][i], (50, 50, 50))else:draw_handle.text((i*block_x, j*block_y), txts[j][i], colors[j][i])name = folder_path_char + str(op) + '.jpg'# print(name)im_txt.save(name, 'JPEG')def createVideo(url):# 设置视频编码器,这里使用使用MJPG编码器fourcc = cv2.VideoWriter_fourcc(*'MJPG')# 输出视频参数设置,包含视频文件名、编码器、帧率、视频宽高(此处参数需和字符图片大小一致)videoWriter = cv2.VideoWriter(url, fourcc, fps, (width,height))for i in range(1, 1000):filename = folder_path_char + str(i) + '.jpg'# 判断图片是否存在if os.path.exists(filename):img = cv2.imread(filename=filename)# 在一个给定的时间内(单位ms)等待用户按键触发,100mscv2.waitKey(100)# 将图片写入视频中videoWriter.write(img)# print(str(i) + '.jpg' + ' done!')# 视频释放videoWriter.release()if __name__ == '__main__':"""使用教程:将抖音视频转换编码,抖音的编码不能直接使用,转成 mp4 格式 -》https://app.xunjiepdf.com/video传入视频地址解析出无声音版的视频提取视频里的 mp3 -》http://audio-extractor.net/cn/用视频编辑器将视频压缩并配乐完成"""print("BEGIN")"""检查文件夹路径在不在"""if not os.path.exists(folder_path):os.mkdir(folder_path)if not os.path.exists(folder_path_char):os.mkdir(folder_path_char)"""end"""url=r'D:\Python_workspace\char_video_sources\dance.mp4'getVideo(url)severalThreadings()#多线程处理图片# getCharPitcure()#单线程处理,已设置默认值为(0,count,False)createVideo(url.replace(".mp4",".avi"))"""删除对应文件夹"""os.system("rd /s /q "+folder_path)os.system("rd /s /q "+folder_path_char)"""END"""print("END")

五、参考博客

  1. https://blog.csdn.net/XZQ121963/article/details/90045996

  2. https://blog.csdn.net/qq_41841569/article/details/84940294

  3. https://blog.csdn.net/weixin_41010198/article/details/88535234

    综上:三篇博客中,综合了第一二篇的优点,我自己又加入了多线程,并且视频长宽完全是基于原视频的,所以在性能和功能上都优于前者,第三篇主要是参考了 cv2 的 get() 函数的属性表

六、运行结果(直接上视频截图,哈,因为需要看出效果,所以抖音上找的一个跳舞的小姐姐,人长得挺漂亮,大家感兴趣可以关注一下,还有用人家图片来写博客也挺不好意思的。)
在这里插入图片描述
在这里插入图片描述


http://chatgpt.dhexx.cn/article/QSd1jc5K.shtml

相关文章

抖音个人主页背景放视频?详解来了

大家都知道抖音个人主页可以设置图片的&#xff0c;那么如何设置成视频形式的呢&#xff1f;一起来看下吧 抖音背景视频设置门槛 抖音品牌号才能设置&#xff0c;普通抖音账户无法设置。 品牌号 品牌号必须是抖音年框客户或是一年品牌消耗100万以上&#xff0c;抖音才会赠送…

html怎么做成锁屏壁纸,抖音怎么把视频做成壁纸 抖音短视频怎么弄成锁屏壁纸-站长资讯中心...

抖音怎么把视频做成壁纸&#xff1f;最近&#xff0c;很多小伙伴都喜欢将抖音的短视频设置成动态壁纸&#xff0c;不过还有些小伙伴们不知道要怎么设置&#xff0c;那么快随小编一起来看看下面的教程吧1 抖音怎么把视频做成壁纸&#xff1f; 1、打开软件后随便刷视频&#xff0…

怎么把抖音的视频转成gif格式?视频转gif的具体方法

当我们遇到有趣的视频想做成表情包时&#xff0c;都会在想这些图片是怎么制作的呢?相信有很多小伙伴都有同样的疑问&#xff0c;有哪些视频转gif工具可以把视频改成gif图片呢?GIF中文网的在线视频转gif功能用起来既简单又方便&#xff0c;支持手机、电脑两种操作模式&#xf…

怎么让抖音视频当做铃声android,把抖音短视频做成手机铃声,原来这么简单!...

原标题&#xff1a;把抖音短视频做成手机铃声&#xff0c;原来这么简单&#xff01; “一日不抖&#xff0c;如隔三秋” 相信十个人里面 有九个都中了抖音的毒 刷起来完全控制不住自己 最近大火的抖音短视频炒火了不少民谣音乐人及一些翻唱歌曲的素人&#xff0c;不知道大家有没…

如何把照片做成视频?抖音爆款的图片视频切换教程,快速上手!

现在都流行用照片随手记录生活。而把照片做成视频&#xff0c;又是现在刷爆抖音、朋友圈的形式。不仅有酷炫的图片切换效果&#xff0c;还带有动听的背景音乐&#xff0c;这样精美又吸睛的照片视频&#xff0c;肯定能让你获得超多赞。今天就教大家用数码大师快速把照片做成视频…

抖音怎么把照片做成视频?超火的照片切换教程,3分钟就能搞定

抖音怎么把照片做成视频?怎么上传照片视频到抖音?抖音上很吸赞的照片切换效果怎么做? 今天教大家3分钟做出一个抖音上比较热门的照片视频,用到的工具是数码大师。 第一步:把照片一次性添加进来 打开数码大师后,选择“视频相册”,点击“添加相片”导入照片。点击“修改…

Adobe Flash cs4 下载安装

Adobe Flash cs4 下载安装 Adobe Flash cs4 下载Adobe Flash cs4 安装Flash Cs4安装之后打不开&#xff08;启动界面一闪而过&#xff09; Adobe Flash cs4 下载 Adobe Flash cs4 下载地址(百度网盘): https://pan.baidu.com/s/1KXTvIlQoa4cDGG16FdP-Vg Adobe Flash cs4 下载…

pdf数据查找网站

PDF Drive - Search and download PDF files for free.https://www.pdfdrive.com/ Library Genesis Proxy Mirror Links: Libgen Io, Libgen rs, Libgen nl, Libgen ishttps://libgen.onl/library-genesis/ Zlibrary、sci-hub、文献、书籍 | 药研导航 (drugx.cn)https://drug…

网站收录查询,常用的2种网站收录查询方法

在网站优化过程中&#xff0c;SEO人员通常都会非常关心网站的收录、索引情况&#xff0c;因为网站建立索引之后&#xff0c;才具有排名的条件。如何查询网站收录情况&#xff1f;今天我们聊聊常用的2种网站收录查询方法。第一种方法&#xff1a;通过site指令在搜索框查询 众多S…

r语言 网站数据查找

工作需要爬一个网站的数据&#xff0c;可是找的真的好累&#xff0c;不想重复劳作了&#xff0c;想起来原来学过的r语言有网站数据查找&#xff0c;就试一试。 library(XML) url<-"https://www.izaiwen.cn/" tbls<-readHTMLTable(url) sapply(tbls,nrow) libr…

如何通过数据进行网站分析

网站的监测指标有很多&#xff0c;一般的统计产品都包括大约20—30个指标。这些指标可以分成五个类别:用户规模、用户粘性、用户来源、网站受众属性、网站内容属性&#xff1b; 用户规模主要是通过PV、UV和独立IP三个指标衡量&#xff1b; 用户粘性主要通过回访率、访问频率和…

我常用的15个数据源网站!

现在有很多免费的数据可以供使用分析&#xff0c;不过很少有人能找的到&#xff0c;或者没能力找&#xff0c;这就是所谓的信息差吧。其实数据获取分为两方面&#xff0c;一是“拿来的”数据&#xff0c;也就是现成的&#xff1b;二是“爬来的”数据&#xff0c;这种一般通过爬…

如何分析网站数据

随着互联网的不断壮大&#xff0c;网站推广早已经成为很多企业首选的推广手段&#xff0c;想要做好网站推广&#xff0c;必须要经常对网站进行数据分析&#xff0c;只有了解了网站的各项数据之后&#xff0c;才能清楚的了解到网站推广优秀与否。那么&#xff0c;如何分析网站数…

找数据?这几个数据源网站就够用了?

来源&#xff1a;经管学苑 转自&#xff1a;经管学苑 大家好&#xff0c;我是小z 在这个用数据说话的时代&#xff0c;能够打动人的往往是用数据说话的理性分析&#xff0c;无论是对于混迹职场的小年轻&#xff0c;还是需要数据进行分析和研究的同学&#xff0c;能够找到合适的…

4个查询网站收录的方式,你中意哪个查询方式呢?

查询网站是否被收录的方式有几个&#xff1f; 4个&#xff1a;site命令、第三方工具、百度站长平台查询、利用接口批量查询。 接下来我们就来介绍这4个查询网站收录的方式&#xff1a; 第一个&#xff1a;site命令 在搜索引擎的搜索框输入:site网址就可以看到改…

要分析数据,可以先去这些数据网站找数据

作者&#xff1a;帆软 来源&#xff1a;知乎 金融财经数据 同花顺数据中心&#xff1a;提供股票债券等金融数据和讯数据&#xff1a;提供各种股票、基金、外汇、债券等实时数据&#xff0c;有付费&#xff0c;有免费零壹财经&#xff1a;大大小小的网贷数据、排行榜等金融数据网…

数据资源丨原始数据哪里找?这些网站要用好!(建议收藏)

资料搜集是个相当繁琐与累的工作&#xff0c;也是投资入门的基本&#xff0c;良好的信息资料搜集能力有利于我们快速了解投资主体的基本情况&#xff0c;为后续的调研及一手资料的获得打下较好的基础。 目录 一、搜索引擎&#xff08;重点掌握&#xff09; 1、搜索关键字的选…

数据网站 免费数据网站

由于职业原因&#xff0c;老李经常需要各个行业的数据&#xff0c;这么多年过去了也搜集了不少。今天就给大家分享一下我的宝藏免费数据网站们。 一、国家社会类 1、中国统计局 链接&#xff1a;http://data.stats.gov.cn/ 这个网站可谓是要啥有啥&#xff0c;如农业&#xff0…

常用的14个获取数据的网站。

转自&#xff1a;菜J学Python 来源&#xff1a;知乎我是小z 除了自家的数据库&#xff0c;分析师免不了要找一些外部的数据来论证某些问题&#xff0c;这里给大家分享14个权威、常用的网站&#xff0c;以备不时之需。 1.中华人民共和国统计局 国家统计局 2. 中国互联网络信息中…

常用的数据查询网站

1、国家数据——主要用户&#xff1a;社会情况研究人员 国家统计局开设网站&#xff0c;公布我国各个领域的宏观经济情况&#xff0c;权威度高 2、中国裁判文书网——主要用户&#xff1a;法律从业/学习/爱好者 中国最高人民法院开设&#xff0c;权威可信&#xff0c;可用于查…