编程语言
首页 > 编程语言> > 用Python管道SoX-替代子流程?

用Python管道SoX-替代子流程?

作者:互联网

我在应用程序中使用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的提示.

标签:sox,inter-process-communicat,subprocess,audio,python
来源: https://codeday.me/bug/20191031/1978092.html