3

我想将音频数据写入标准输出,最好使用 libsndfile。当我将 WAV 输出到 /dev/stdout 时,我设法编写了标题,但随后出现错误

Error : could not open file : /dev/stdout
System error : Illegal seek.

我认为这与http://www.mega-nerd.com/libsndfile/FAQ.html#Q017有关,某些文件格式无法在没有搜索的情况下编写。但是,当我尝试输出 SF_FORMAT_AU | SF_FORMAT_PCM_16 相反,我仍然得到同样的非法搜索错误。

有没有什么音频文件格式可以完全不用搜索就可以写出来?

我正在使用 Linux。

编辑:这可能很明显,但 RAW 格式有效(无需搜索)。不幸的是,我需要一种包含采样率等元信息的格式。

4

3 回答 3

3

您应该阅读完该常见问题解答...您提供给我们的链接包含所有答案。

但是,至少有一种文件格式 (AU) 专门设计用于写入管道。

所以使用AU而不是WAV。

还要确保使用sf_open_fd,而不是 sf_open_virtual(或sf_open)打开 SNDFILE 对象:

SNDFILE* sf_open_fd      (int fd, int mode, SF_INFO *sfinfo, int close_desc) ;
SNDFILE* sf_open_virtual (SF_VIRTUAL_IO *sfvirtual, int mode, SF_INFO *sfinfo,
                          void *user_data) ;

如果使用sf_open_fd,则 libsndfile 将用于fstat确定文件描述符是管道还是常规文件。如果您使用sf_open_virtualor sf_open,它将假定该文件是可搜索的。这似乎是 libsndfile 中的一个缺陷,但sf_open_fd无论如何您都应该使用它。

脚注:不要打开/dev/stdout以获得标准输出;它已经打开了,无需再次打开它。使用文件描述符STDOUT_FILENO

于 2011-12-03T20:13:21.583 回答
0

结束输出“无限” wav 标头,然后在音频持续的时间内写入原始 PCM 数据。不是真的有效,但无论如何大多数玩家似乎都理解。

wav 标头在这里,以防有人想要它:https ://gist.github.com/1428176

于 2011-12-03T21:23:02.647 回答
0

您可以写入临时文件(可能在 /tmp 中),让 libsnd 寻求修改临时文件的 .wav(RIFF) 标头,然后在 libsnd 关闭文件后,将临时文件流式传输到标准输出。

于 2011-12-03T23:51:46.977 回答