Python使用moviepy讀取字幕srt文件報(bào)錯(cuò)的解決方法詳解
前言
最近研究moviepy,使用其給視頻添加字幕,卻發(fā)現(xiàn)一個(gè)很久不會(huì)碰到的問(wèn)題----文件編碼問(wèn)題。這在python3.x很少發(fā)生了。不成想,moviepy還是有bug。
debug也是編程樂(lè)趣之一。不過(guò)寫(xiě)到這里,希望以后官方升級(jí)可以修復(fù)這個(gè)問(wèn)題。
一、SubtitlesClip讀取srt文件報(bào)錯(cuò)
報(bào)錯(cuò)信息如下:
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
二、問(wèn)題剖析
打開(kāi)d:\ProgramData\anaconda3\envs\python38\lib\site-packages\moviepy\video\tools\subtitles.py
我這里是虛擬了一個(gè)python3.8的環(huán)境(每個(gè)人不一樣),看報(bào)錯(cuò)信息即可知道文件在哪里。
根據(jù)以上報(bào)錯(cuò)信息,可以知道:
def __init__(self, subtitles, make_textclip=None):
VideoClip.__init__(self, has_constant_size=False)
if isinstance(subtitles, str):
subtitles = file_to_subtitles(subtitles)
42行,也就是最后一樣,調(diào)用了154行。
with open(filename,'r') as f:
for line in f:
因?yàn)?53行,with open(filename,‘r’) as f: 沒(méi)有添加打開(kāi)文件使用的編碼,所以UTF-8格式的srt文件被Windows系統(tǒng)默認(rèn)使用GBK模式打開(kāi),就出現(xiàn)了文章開(kāi)通的報(bào)錯(cuò)提示了。
三、解決辦法(2種)
這個(gè)問(wèn)題很好解決,就是打開(kāi)文件時(shí)增加編碼格式就行。
(唉,這么low的bug)
如果srt文件都是utf-8編碼格式,使用1方法即可解決。如果還有其它格式,可通過(guò)2方法完美解決。
1. 增加encoding='utf-8’的臨時(shí)解決辦法
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. 通過(guò)類(lèi)初始化傳遞參數(shù)的終極解決辦法
上面的方法,如果srt文件不是utf-8則也會(huì)報(bào)錯(cuò),是否可以將其改為參數(shù)運(yùn)行呢?
那當(dāng)然可以啦!
不過(guò),需要修改多個(gè)地方,分別在class定義的 init()參數(shù)里增加encoding=‘utf-8’,然后在調(diào)用函數(shù)將encoding進(jìn)行傳遞;file_to_subtitles(filename)參數(shù)增加encoding,打開(kāi)文件也增加。至此完成修改。目的就是在class初始化時(shí)就傳遞encoding參數(shù),并層層調(diào)用后增加到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:
因?yàn)檫@里給類(lèi)初始化賦值了encoding=‘utf-8’,所以默認(rèn)是此格式的話,調(diào)用方法不加此參數(shù)一樣可以使用,不會(huì)報(bào)錯(cuò)。如下:
sub = SubtitlesClip("subtitles.srt", generator)
如果是gbk的格式,才需要在類(lèi)初始化時(shí)增加encoding參數(shù),如下:
sub = SubtitlesClip("subtitles.srt", generator, encoding='gbk')
總結(jié)
以前python2.x文字編碼老是各種出錯(cuò),改用python3.x后,編碼及中文問(wèn)題都得到了解決。不曾想還是會(huì)應(yīng)為編碼問(wèn)題倒是文件打不開(kāi)或者亂碼。
UnicodeDecodeError: 'gbk' codec can't decode byte 0xad in position 54: illegal multibyte sequence
以后看到這個(gè)提示,先檢查字符編碼。然后就是打開(kāi)方式,通常都可以解決。
到此這篇關(guān)于Python使用moviepy讀取字幕srt文件報(bào)錯(cuò)的解決方法詳解的文章就介紹到這了,更多相關(guān)Python解決moviepy讀取字幕srt報(bào)錯(cuò)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- MoviePy簡(jiǎn)介及Python視頻剪輯自動(dòng)化
- python用moviepy對(duì)視頻進(jìn)行簡(jiǎn)單的處理
- Python使用MoviePy輕松搞定視頻編輯
- python?moviepy?的用法入門(mén)篇
- MoviePy常用剪輯類(lèi)及Python視頻剪輯自動(dòng)化
- Python視頻剪輯Moviepy庫(kù)使用教程
- python基于moviepy實(shí)現(xiàn)音視頻剪輯
- Python使用MoviePy實(shí)現(xiàn)編輯音視頻并添加字幕
- Moviepy模塊實(shí)現(xiàn)視頻添加圖片水印
- 基于Python和MoviePy實(shí)現(xiàn)照片管理和視頻合成工具
- 使用MoviePy實(shí)現(xiàn)圖像序列合成視頻并添加背景音樂(lè)
相關(guān)文章
Python中splitlines()方法的使用簡(jiǎn)介
這篇文章主要介紹了Python中splitlines()方法的使用簡(jiǎn)介,是Python入門(mén)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-05-05
python3.12安裝jupyter環(huán)境的實(shí)現(xiàn)
本文主要介紹了編譯安裝Python3.12(需OpenSSL1.1.1以上避免SSL錯(cuò)誤)并配置Jupyter環(huán)境的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2025-05-05
實(shí)例詳解Python中的numpy.abs和abs函數(shù)
Numpy是python中最有用的工具之一,它可以有效地處理大容量數(shù)據(jù),下面這篇文章主要給大家介紹了關(guān)于Python中numpy.abs和abs函數(shù)的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-08-08
帶你學(xué)習(xí)Python如何實(shí)現(xiàn)回歸樹(shù)模型
這篇文章主要介紹了Python如何實(shí)現(xiàn)回歸樹(shù)模型,文中講解非常細(xì)致,幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下2020-07-07
python?sns.countplot()?繪畫(huà)條形圖詳情
這篇文章主要介紹了python?sns.countplot()繪畫(huà)條形圖詳情,sns.countplot()用于畫(huà)類(lèi)別特征的頻數(shù)條形圖,更多相關(guān)內(nèi)容需要的朋友可以參考一下2022-06-06
Python數(shù)據(jù)清洗&預(yù)處理入門(mén)教程
凡事預(yù)則立,不預(yù)則廢,訓(xùn)練機(jī)器學(xué)習(xí)模型也是如此。數(shù)據(jù)清洗和預(yù)處理是模型訓(xùn)練之前的必要過(guò)程,否則模型可能就廢了。本文是一個(gè)初學(xué)者指南,將帶你領(lǐng)略如何在任意的數(shù)據(jù)集上,針對(duì)任意一個(gè)機(jī)器學(xué)習(xí)模型,完成數(shù)據(jù)預(yù)處理工作2022-10-10
Python控制自己的手機(jī)攝像頭拍照并自動(dòng)發(fā)送到郵箱案例講解
這篇文章主要介紹了Python控制自己的手機(jī)攝像頭拍照,并把照片自動(dòng)發(fā)送到郵箱,大概思路是通過(guò)opencv調(diào)用攝像頭拍照保存圖像本地用email庫(kù)構(gòu)造郵件內(nèi)容,保存的圖像以附件形式插入郵件內(nèi)容用smtplib庫(kù)發(fā)送郵件到指定郵箱,需要的朋友可以參考下2022-04-04
openCV入門(mén)學(xué)習(xí)基礎(chǔ)教程第三篇
pencv是用于快速處理圖像處理、計(jì)算機(jī)視覺(jué)問(wèn)題的工具,支持多種語(yǔ)言進(jìn)行開(kāi)發(fā)如c++、python、java等,下面這篇文章主要給大家介紹了關(guān)于openCV入門(mén)學(xué)習(xí)基礎(chǔ)教程的相關(guān)資料,需要的朋友可以參考下2022-11-11

