在文件描述符上连续运行aubiopitch

时间:2014-10-03 20:15:02

标签: audio sox audio-analysis aubio

我想使用aubiopitch连续输出来自输入源的信号频率。由于aubiopitch喜欢将其输入设为文件而非流,因此我尝试使用process substitution

$ aubiopitch -i <(sox -q -d -t wav -)

我希望这能输出从默认音频输入设备读取的信号频率。相反,我得到了这个:

./sox WARN wav: Length in output .wav header will be wrong since can't seek to fix it
AUBIO ERROR: source_apple_audio: Failed opening /dev/fd/63, error in ExtAudioFileOpenURL (-40)
AUBIO ERROR: source_wavread: could not find RIFF header in /dev/fd/63
AUBIO ERROR: source: failed creating aubio source with /dev/fd/63 at samplerate 0 with hop_size 256
Error: could not open input file /dev/fd/63

问题似乎不在于sox,因为此命令可以正常工作:

cat <(sox -q -d -t wav -) > output.wav

它会创建一个output.wav文件,除了aubiopitch当然除了$ aubiopitch output.wav Segmentation fault: 11 之外似乎没有任何问题:

{{1}}

这里发生了什么? RIFF标题的问题是否设置了错误的长度?

如果重要的话,我正在运行OSX 10.7.5并且我重新编译了aubio以使用我的旧OSX版本。

1 个答案:

答案 0 :(得分:0)

$ sox -q -d -t wav - | aubiopitch -i -

使用libsndfile支持'-' = stdin编译时,上面的命令可以提供以下输出。

sox WARN wav: Length in output .wav header will be wrong since can't seek to fix it
0.000000 0.000000
0.005805 707.323486
0.011610 [...]

如果您使用更多来源(avcodecapple_audio)编译了aubio,您将收到更多警告。您可以通过将stderr重定向到/dev/null来隐藏这些警告。以下是aubioonset的示例:

$ ( sox -q -d -t wav - | aubioonset -i - ) 2> /dev/null
0.000000
0.096871
0.279297
[...]