アプリケーションで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 拡張機能を作成する以外に、このアプローチに代わるものはありますか?