大一时做的实训项目。今年重新运行时发现由于PIL库更新,getsize()函数已无法使用。故重新修改了一下发上来。
代码请点击这里下载
代码中的注释已经写的很详尽。
如何实现彩色字符动画
原本做的是彩色视频转彩色字符动画,但实际生成图片的效率很低,耗时很长,这里主要讲一下思路:
- 将视频提取每一帧
- 将每一帧转换为字符画
- 将字符画拼接成视频
你需要下载ffmpeg插件,opencv,os和subprocess库。
代码参考
将视频逐帧输出图片到文件夹A之后,输入文件夹A的路径,对图片进行转换处理,将处理后的图片存到文件夹B中。
1 2 3 4 5 6 7
| path = input("请输入路径(例如D:\\picture):") filelist = os.listdir(path) for files in filelist:#循环处理文件夹中所有文件 Oldimg = os.path.join(path, files)#把图片的名字也组合上 if os.path.isdir(Oldimg): continue ascii_art(Oldimg)
|
将转换好的图片封装成视频。这里的路径换成你自己的,前面的路径是文件夹B,后面的路径是你希望存储封装后视频的路径。
1 2
| cmd2='ffmpeg -f image2 -framerate 30 -i D:\\Pshixun\\out\\%d.jpg.png D:\\Pshixun\\outvideo.mp4' sp.call(cmd2,shell=True)
|
为视频添加音频,并播放。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| cmd3='ffmpeg -i D:\\Pshixun\\outvideo.mp4 -c:v copy -an D:\\Pshixun\\NO_AUDIO.mp4' sp.call(cmd3,shell=True) cmd4='ffmpeg -i D:\\Pshixun\\NO_AUDIO.mp4 -i D:\\Pshixun\\V.aac -c copy D:\\Pshixun\\WITHAUDIO.mp4' sp.call(cmd4,shell=True) cap = cv2.VideoCapture('WITHAUDIO.mp4') while cap.isOpened(): ret, frame = cap.read() # 如果正确读取帧,ret为True cv2.namedWindow("frame",0) cv2.resizeWindow("frame",500,1100) if not ret: print("Can't receive frame (stream end?). Exiting ...") break color = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) cv2.imshow('frame', color) if cv2.waitKey(1) == ord('q'): break cap.release() cv2.destroyAllWindows()
|
(*演示视频请看)如果代码运行不成功,欢迎找我讨论。(虽然只有GitHub和bilibili的联系方式啦)