我正在尝试将大约 300 个 mp4 视频(来自 Ekman-6 数据集)转换为 mp3 音频文件。我目前正在使用 MoviePy 的
VideoFileClip
(在 Google Colab 中)进行此转换:
id = 0
for i in range(6):
path = directory + folders[i]
cnt = 0
for file in os.listdir(path):
filename = os.fsdecode(file)
clip = VideoFileClip(path + filename)
audio = clip.audio
audio.write_audiofile(to_directory + folders[i] + str(id) + ".mp3")
audio.close()
clip.close()
id += 1
cnt += 1
if cnt == 50:
break
但是,在转换第 47 个文件时,我收到以下错误:
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-4-c6ad7f378072> in <cell line: 7>()
12 clip = VideoFileClip(directory + folders[i] + file)
13 audio = clip.audio
---> 14 audio.write_audiofile(to_directory + folders[i] + str(id) + ".mp3")
15 audio.close()
16 clip.close()
AttributeError: 'NoneType' object has no attribute 'write_audiofile'
我不确定是什么导致了此错误。于是,我在网上搜索了一下,发现另一个stackoverflow帖子说这个问题是由于mp4文件没有音频而引起的。因此,我检查了导致错误的文件,但它实际上确实有音频。为了 100% 确定 MoviePy 正确地将文件转换为音频,我还单独对该文件进行了转换。这次,MoviePy 成功地将文件转换为音频。
为什么 MoviePy 本身可以处理该文件,但在转换之前的 46 个文件后却不起作用?使用 MoviePy 可以转换的文件数量/视频长度是否有限制?我在网上找不到任何有关此的信息。
这个错误信息表明,在处理到第 47 个文件时,
clip.audio
返回了
None
,意味着 MoviePy 没有成功地从视频文件中提取音频。但这与你单独转换该文件时 MoviePy 能成功提取音频相矛盾。
这可能是以下几个原因导致的:
-
内存泄漏: 每次循环中,你都创建了
VideoFileClip
和AudioFileClip
对象,但没有显式地释放它们占用的内存。尽管你调用了close()
方法,但这可能不足以释放所有资源,尤其是在处理大量文件时。随着循环进行,内存泄漏可能导致 MoviePy 无法正常工作,最终导致错误。 -
文件特定问题: 虽然你已经检查了出错的文件,但该文件可能存在一些 MoviePy 难以处理的特殊问题,例如编码问题、损坏的帧等。这可能导致 MoviePy 在特定情况下无法提取音频。
-
MoviePy 版本问题: 你使用的 MoviePy 版本可能存在 bug,导致在处理特定数量的文件后出现问题。
为了解决这个问题,你可以尝试以下几个方法:
-
显式释放内存: 在每次循环结束后,使用
del
语句显式地删除VideoFileClip
和AudioFileClip
对象,以确保释放它们占用的内存:python del audio del clip
-
跳过出错文件并记录: 在
try...except
块中调用write_audiofile
,捕获AttributeError
并跳过出错文件,同时记录出错文件名,以便后续排查:python try: audio.write_audiofile(to_directory + folders[i] + str(id) + ".mp3") except AttributeError: print(f"Error processing file: {filename}") with open("error_log.txt", "a") as f: f.write(f"{filename}\n") continue
-
更新 MoviePy: 尝试更新 MoviePy 到最新版本,看看问题是否得到解决:
bash pip install --upgrade moviepy
-
使用其他库: 如果以上方法都无法解决问题,你可以考虑使用其他 Python 库来提取音频,例如
librosa
或pydub
。
希望这些方法能帮助你解决问题!如果还有其他问题,请随时提出。
标签:python,moviepy From: 78802929