当音频片段文件过大时,pydub能避免内存错误吗?

3

每当文件很大时(比如电影的长度),我都会遇到内存错误。有没有办法处理大文件音频片段?

sound = AudioSegment.from_mp3("vanilla_sky.mp3")
File "D:\Python27\lib\site-packages\pydub\audio_segment.py", line 423, in from_mp3
return cls.from_file(file, 'mp3')
File "D:\Python27\lib\site-packages\pydub\audio_segment.py", line 412, in from_file
obj = cls._from_safe_wav(output)
File "D:\Python27\lib\site-packages\pydub\audio_segment.py", line 445, in _from_safe_wav
return cls(data=file)
File "D:\Python27\lib\site-packages\pydub\audio_segment.py", line 130, in __init__
data = data if isinstance(data, basestring) else data.read()
MemoryError
1个回答

3
简而言之,不可以——pydub的AudioSegment表示音频本身(并包含音频数据)。
关于添加流式版本的AudioSegment以帮助解决这些内存问题已经有一些讨论,但这项工作尚未完成(尽管我不知道有没有人打算着手处理它)。
解决方法:
如果您只想转换音频,您可以打开日志记录并复制您需要进行转换的特定ffmpeg命令。日志输出将显示一个子进程调用,您可以立即在python代码中使用它。
>>> import logging

>>> l = logging.getLogger("pydub.converter")
>>> l.setLevel(logging.DEBUG)
>>> l.addHandler(logging.StreamHandler())

>>> AudioSegment.from_file("./vanilla_sky.mp3")
subprocess.call(['ffmpeg', '-y', '-i', '/var/folders/71/42k8g72x4pq09tfp920d033r0000gn/T/tmpeZTgMy', '-vn', '-f', 'wav', '/var/folders/71/42k8g72x4pq09tfp920d033r0000gn/T/tmpK5aLcZ'])

第一个/var/...文件是输入文件的副本,第二个是输出文件,在转换完成后加载到AudioSegment中。


1
我通过使用64位的Python解释器解决了这个错误……不管怎样,谢谢你的回答。 - Leo Hsieh
@LeoHsieh 很有趣...我之前没有考虑到那个潜在的问题。 - Jiaaro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接