原视频
![]()
转换后
![]()
import os
import cv2
import numpy as np
from moviepy.editor import AudioFileClip, VideoFileClip
def pixel2char(pixel):
char_list = "@#$%&abqwertyuioopasdfghjklzxcvbnm=+---. "
char_list = "$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~ <>i!lI;:,\"^`'. "
index = int(pixel / 256 * len(char_list))
return char_list[index]
def get_char_img(img, scale=4, font_size=10):
# 调整图片大小
h, w = img.shape
re_im = cv2.resize(img, (w // scale, h // scale))
# 创建一张图片用来填充字符
char_img = np.ones((h // scale * font_size, w // scale * font_size), dtype=np.uint8) * 255
font = cv2.FONT_HERSHEY_SIMPLEX
# 遍历图片像素
for y in range(0, re_im.shape[0]):
for x in range(0, re_im.shape[1]):
char_pixel = pixel2char(re_im[y][x])
cv2.putText(char_img, char_pixel, (x * font_size, y * font_size), font, 0.5, (0, 0, 0))
return char_img
def generate(input_video, output_video):
# 1、读取视频
cap = cv2.VideoCapture(input_video)
# 2、获取视频帧率
fps = cap.get(cv2.CAP_PROP_FPS)
# 读取第一帧,获取转换成字符后的图片的尺寸
ret, frame = cap.read()
char_img = get_char_img(cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY), 4)
# 创建一个VideoWriter,用于保存视频
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
writer = cv2.VideoWriter(output_video, fourcc, fps, (char_img.shape[1], char_img.shape[0]))
while ret:
# 读取视频的当前帧,如果没有则跳出循环
ret, frame = cap.read()
if not ret:
break
# 将当前帧转换成字符图
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
char_img = get_char_img(gray, 4)
# 转换成BGR模式,便于写入视频
char_img = cv2.cvtColor(char_img, cv2.COLOR_GRAY2BGR)
writer.write(char_img)
writer.release()
# 从视频中获取背景音乐
def extract_audio(input_video, output_audio):
video_clip = VideoFileClip(input_video)
audio_clip = video_clip.audio
audio_clip.write_audiofile(output_audio)
if __name__ == '__main__':
baseMp4 = 'xxxx.mp4'
tempOutMp4 = 'out.mp4'
outMp3 = 'output.mp3'
lastOutMp4 = 'out1.mp4'
generate(baseMp4, tempOutMp4)
# 判断mp3是否存在,不存在就从mp4提取
if not os.path.exists(outMp3):
extract_audio(baseMp4,outMp3)
# 加载视频文件
video_clip = VideoFileClip(tempOutMp4)
# 加载背景音乐文件
audio_clip = AudioFileClip(outMp3)
# 将背景音乐添加到视频中
video_clip = video_clip.set_audio(audio_clip)
# 导出最终的视频文件
video_clip.write_videofile(lastOutMp4)
# 删除临时数据
os.remove(tempOutMp4)