我希望那里的一些天才可以帮助我解决这个问题......
我正在使用sox来合并和重新采样一组WAV文件,并将输出直接传输到NeroAACEnc的输入以便编码为AAC格式。
我最初在脚本中运行了该过程,其中包括:
sox.exe d:\audio\1.wav d:\audio\2.wav d:\audio\3.wav -c 1 -r 22050 -t wav - | neroAacEnc.exe -q 0.5 -if - -of test.m4a
这按预期工作。命令行中的“ - ”转换为“管道/重定向输入/输出(stdin / stdout)” - 所以Sox管道输出到stdout,NeroAACEnc从stdin读取,|加入他们。
然后我将整个解决方案迁移到Python,等效命令变为:
from subprocess import call, Popen, PIPE
runwav = Popen(['sox.exe', 'd:\audio\1.wav', 'd:\audio\2.wav', 'd:\audio\3.wav', '-c', '1', '-r', '22050', '-t', 'wav', '-'], shell=False, stdout=PIPE)
runm4b = call(['neroAacEnc.exe', '-q', '0.5', '-if', '-', '-of', 'test.m4a'], shell=False, stdin=runwav.stdout)
这也像魅力一样,完全符合预期。稍微复杂一点,但是嘿:)
现在我必须将其移至IronPython,并且Subprocess模块不可用(部分实现,即没有Popen / PIPE支持 - 加上在可能的情况下添加自定义库似乎很愚蠢一个原生的替代品)。 UPDATE 部分模块支持Popen和PIPE,我误读了它。可以从此模块中提取.net / IronPython解决方案的细节(请参阅下面的更新)
我应该在这里提一下,我选择了IronPython而不是C#,因为我现在对Python感到很自在 - 但是,之后有机会再将它移动到C#native,我正在使用IronPython让自己放松:我没有C#或.net经验。
到目前为止,我有以下等效项,它设置了2个进程:
from System.Diagnostics import Process
wav = Process()
wav.StartInfo.UseShellExecute = False
wav.StartInfo.RedirectStandardOutput = True
wav.StartInfo.FileName = 'sox.exe'
wav.StartInfo.Arguments = 'd:\audio\1.wav d:\audio\2.wav d:\audio\3.wav -c 1 -r 22050 -t wav -'
wav.Start()
m4b = Process()
m4b.StartInfo.UseShellExecute = False
m4b.StartInfo.RedirectStandardInput = True
m4b.StartInfo.FileName = 'neroAacEnc.exe'
m4b.StartInfo.Arguments = '-q 0.5 -if - -of test.m4a'
m4b.Start()
我知道这两个进程开始了(我可以在任务管理器中看到Nero和Sox)但是我无法弄清楚(对于我的生活)是如何将两个输出/输入流串在一起,如与前两个解决方案。我搜索过,所以我想我会问!
如果有人知道:
P.S。基于以上内容的代码示例将是非常棒的:)或者我可以轻松翻译的类似过程的特定代码示例。
[UPDATE]
经过考虑,我决定将我的特定情景作为两个单独的过程来处理;将合并的WAV输出到文件,然后使用该文件作为转换的输入。
但是,可以使用可用的子进程模块here来实现我想要的效果。
答案 0 :(得分:1)
Windows已命名管道,您可以在IronPython等.NET应用程序中使用它们。翻译VB.NET示例like this one通常很简单。您经常可以找到类似这样的托管库,例如http://www.codeproject.com/KB/threads/dotnetnamedpipespart1.aspx
这是另一个围绕管道api创建包装器的项目。 http://omegacoder.com/?p=101