用Python管道SoX-替代子流程?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了用Python管道SoX-替代子流程?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1499字,纯文字阅读大概需要3分钟。
内容图文
![用Python管道SoX-替代子流程?](/upload/InfoBanner/zyjiaocheng/676/25e3024fc5394372bb5b14724e193c91.jpg)
我在应用程序中使用SoX.应用程序使用它对音频文件进行各种操作,例如修剪.
这工作正常:
from subprocess import Popen, PIPE
kwargs = {'stdin': PIPE, 'stdout': PIPE, 'stderr': PIPE}
pipe = Popen(['sox','-t','mp3','-', 'test.mp3','trim','0','15'], **kwargs)
output, errors = pipe.communicate(input=open('test.mp3','rb').read())
if errors:
raise RuntimeError(errors)
由于read()将整个文件加载到内存中,因此这将导致大文件出现问题.这很慢,可能会导致管道缓冲区溢出.存在一种解决方法:
from subprocess import Popen, PIPE
import tempfile
import uuid
import shutil
import os
kwargs = {'stdin': PIPE, 'stdout': PIPE, 'stderr': PIPE}
tmp = os.path.join(tempfile.gettempdir(), uuid.uuid1().hex + '.mp3')
pipe = Popen(['sox','test.mp3', tmp,'trim','0','15'], **kwargs)
output, errors = pipe.communicate()
if errors:
raise RuntimeError(errors)
shutil.copy2(tmp, 'test.mp3')
os.remove(tmp)
因此,问题如下:除了为Sox C API编写Python扩展之外,该方法是否还有其他选择?
解决方法:
SoX的Python包装器已经存在:sox.也许最简单的解决方案是切换到使用该包装,而不是通过子进程调用外部SoX命令行实用程序.
以下代码使用sox包(请参见documentation)实现了示例中的目标,并且可以在Linux和python 2.7、3.4和3.5的macOS上运行(它也可能在Windows上运行,但是我无法进行测试,因为我无法访问Windows框):
>>> import sox
>>> transformer = sox.Transformer() # create transformer
>>> transformer.trim(0, 15) # trim the audio between 0 and 15 seconds
>>> transformer.build('test.mp3', 'out.mp3') # create the output file
注意:此答案用于提及不再维护的pysox软件包.感谢@erik的提示.
内容总结
以上是互联网集市为您收集整理的用Python管道SoX-替代子流程?全部内容,希望文章能够帮你解决用Python管道SoX-替代子流程?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。