无需搜索即可编写的音频文件格式

时间:2011-12-03 19:51:55

标签: c linux audio file-format libsndfile

我想将音频数据写入stdout,最好使用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格式有效(不寻求)。不幸的是,我需要一种具有采样率等元信息的格式。

3 个答案:

答案 0 :(得分:3)

你应该读完那个FAQ ...你给我们的链接都有答案。

  

但是,至少有一种文件格式(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_virtualsf_open,则会认为该文件是可搜索的。这似乎是libsndfile中的一个缺陷,但无论如何你应该使用sf_open_fd

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

答案 1 :(得分:0)

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

wav标题在这里,万一有人想要它:https://gist.github.com/1428176

答案 2 :(得分:0)

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