Python使用moviepy读取字幕srt文件报错的解决方法详解
作者:IT里的交易员
前言
最近研究moviepy,使用其给视频添加字幕,却发现一个很久不会碰到的问题----文件编码问题。这在python3.x很少发生了。不成想,moviepy还是有bug。
debug也是编程乐趣之一。不过写到这里,希望以后官方升级可以修复这个问题。
一、SubtitlesClip读取srt文件报错
报错信息如下:
subtitles = SubtitlesClip(srt_path, generator)
File "d:\ProgramData\anaconda3\envs\python38\lib\site-packages\moviepy\video\tools\subtitles.py", line 42, in __init__
subtitles = file_to_subtitles(subtitles)
File "d:\ProgramData\anaconda3\envs\python38\lib\site-packages\moviepy\video\tools\subtitles.py", line 154, in file_to_subtitles
for line in f:
UnicodeDecodeError: 'gbk' codec can't decode byte 0xad in position 54: illegal multibyte sequence
二、问题剖析
打开d:\ProgramData\anaconda3\envs\python38\lib\site-packages\moviepy\video\tools\subtitles.py
我这里是虚拟了一个python3.8的环境(每个人不一样),看报错信息即可知道文件在哪里。
根据以上报错信息,可以知道:
def __init__(self, subtitles, make_textclip=None): VideoClip.__init__(self, has_constant_size=False) if isinstance(subtitles, str): subtitles = file_to_subtitles(subtitles)
42行,也就是最后一样,调用了154行。
with open(filename,'r') as f: for line in f:
因为153行,with open(filename,‘r’) as f: 没有添加打开文件使用的编码,所以UTF-8格式的srt文件被Windows系统默认使用GBK模式打开,就出现了文章开通的报错提示了。
三、解决办法(2种)
这个问题很好解决,就是打开文件时增加编码格式就行。
(唉,这么low的bug)
如果srt文件都是utf-8编码格式,使用1方法即可解决。如果还有其它格式,可通过2方法完美解决。
1. 增加encoding='utf-8’的临时解决办法
with open(filename,'r') as f: for line in f:
将以上修改如下,增加encoding='utf-8’即可。
with open(filename,'r', encoding='utf-8') as f: for line in f:
2. 通过类初始化传递参数的终极解决办法
上面的方法,如果srt文件不是utf-8则也会报错,是否可以将其改为参数运行呢?
那当然可以啦!
不过,需要修改多个地方,分别在class定义的 init()参数里增加encoding=‘utf-8’,然后在调用函数将encoding进行传递;file_to_subtitles(filename)参数增加encoding,打开文件也增加。至此完成修改。目的就是在class初始化时就传递encoding参数,并层层调用后增加到with open(filename,‘r’, encoding=encoding) as f:这一行。
修改后的代码如下:
class SubtitlesClip(VideoClip): """ A Clip that serves as "subtitle track" in videos. One particularity of this class is that the images of the subtitle texts are not generated beforehand, but only if needed. Parameters ========== subtitles Either the name of a file, or a list Examples ========= >>> from moviepy.video.tools.subtitles import SubtitlesClip >>> from moviepy.video.io.VideoFileClip import VideoFileClip >>> generator = lambda txt: TextClip(txt, font='Georgia-Regular', fontsize=24, color='white') >>> sub = SubtitlesClip("subtitles.srt", generator) >>> myvideo = VideoFileClip("myvideo.avi") >>> final = CompositeVideoClip([clip, subtitles]) >>> final.write_videofile("final.mp4", fps=myvideo.fps) """ def __init__(self, subtitles, make_textclip=None,encoding='utf-8'): VideoClip.__init__(self, has_constant_size=False) if isinstance(subtitles, str): subtitles = file_to_subtitles(subtitles,encoding=encoding)
def file_to_subtitles(filename,encoding): """ Converts a srt file into subtitles. The returned list is of the form ``[((ta,tb),'some text'),...]`` and can be fed to SubtitlesClip. Only works for '.srt' format for the moment. """ times_texts = [] current_times = None current_text = "" with open(filename,'r', encoding=encoding) as f:
因为这里给类初始化赋值了encoding=‘utf-8’,所以默认是此格式的话,调用方法不加此参数一样可以使用,不会报错。如下:
sub = SubtitlesClip("subtitles.srt", generator)
如果是gbk的格式,才需要在类初始化时增加encoding参数,如下:
sub = SubtitlesClip("subtitles.srt", generator, encoding='gbk')
总结
以前python2.x文字编码老是各种出错,改用python3.x后,编码及中文问题都得到了解决。不曾想还是会应为编码问题倒是文件打不开或者乱码。
UnicodeDecodeError: 'gbk' codec can't decode byte 0xad in position 54: illegal multibyte sequence
以后看到这个提示,先检查字符编码。然后就是打开方式,通常都可以解决。
到此这篇关于Python使用moviepy读取字幕srt文件报错的解决方法详解的文章就介绍到这了,更多相关Python解决moviepy读取字幕srt报错内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!