注册 登录
编程论坛 Python论坛

moviepy为视频添加字幕

xdzzzxc 发布于 2023-04-07 00:01, 679 次点击
import os,pathlib,random
from os.path import splitext,isfile
from moviepy.editor import (VideoFileClip,TextClip,CompositeVideoClip)
src_path=os.path.join(os.getcwd(),u"audios")
print(src_path)
src_path=pathlib.Path(src_path)
print(src_path)
mp4_list=[]
txt_list=[]
for item in src_path.iterdir():
    if ".mp4" in str(item):
        mp4_list.append(str(item))
    elif ".txt" in str(item):
        txt_list.append(str(item))
print(mp4_list)
print(txt_list)
if len(mp4_list)>0:
    src_mp4=random.choice(mp4_list) #随机选取一个音频文件并得到相应的txt文件
    src_txt=src_mp4.replace("mp4","txt")
else:
    print("No mp4_file exist!")
    exit()
src_txt=random.choice(txt_list)
video=VideoFileClip(src_mp4)
w,h=video.w,video.h
txts=[]

tran_to_srt_list=[]
each_of_time_start=0
each_of_time_duration=0

with open(src_txt,'r',encoding='utf-8') as f:
    # print(f.readlines())
    for line in f.readlines():
        each_of_time_duration=(len(line)-1)/(180/60)
        
        txt=(TextClip(line,fontsize=40,font="STLITI.TTF",size=(w-20,h),
            align="center",color="black")
            .set_position((10,h-150))
            .set_duration(each_of_time_duration).set_start(each_of_time_start))
        txts.append(txt)
        each_of_time_start=each_of_time_start+each_of_time_duration+0.5
print(len(txts))
print(*txts)

video=CompositeVideoClip([video,*txts])
运行后,到最后这一步出错:TypeError: cannot unpack non-iterable NoneType object
2 回复
#2
东海ECS2023-04-07 19:17
这个错误可能是因为在读取txt文件时,没有找到相应的文件导致的。建议在读取txt文件之前,先添加一个判断文件是否存在的语句。例如:
程序代码:

if not os.path.exists(src_txt):
    print("No txt_file exist!")
    exit()

同时,也建议在读取txt文件时,使用strip()方法去除每行末尾的空格和换行符,例如:
程序代码:

for line in f.readlines():
    line = line.strip()
    each_of_time_duration=(len(line)-1)/(180/60)
    ... # 省略内容
#3
xdzzzxc2023-06-29 09:34
回复 2楼 东海ECS
谢谢!
1