C 无需查找即可写入的音频文件格式

C 无需查找即可写入的音频文件格式,c,linux,audio,file-format,libsndfile,C,Linux,Audio,File Format,Libsndfile,我想将音频数据写入stdout,最好使用libsndfile。当我将WAV输出到/dev/stdout时,我设法写入了头文件,但随后出现了一个错误 Error : could not open file : /dev/stdout System error : Illegal seek. 我假设这与,一些文件格式不能写没有搜索。然而,当我尝试输出SF_FORMAT_AU | SF_FORMAT_PCM_16时,仍然会得到相同的非法寻道错误 是否有任何音频文件格式可以完全写入而无需查找 我正在使

我想将音频数据写入stdout,最好使用libsndfile。当我将WAV输出到/dev/stdout时,我设法写入了头文件,但随后出现了一个错误

Error : could not open file : /dev/stdout
System error : Illegal seek.
我假设这与,一些文件格式不能写没有搜索。然而,当我尝试输出SF_FORMAT_AU | SF_FORMAT_PCM_16时,仍然会得到相同的非法寻道错误

是否有任何音频文件格式可以完全写入而无需查找

我正在使用Linux


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

您应该读完该常见问题解答。。。你给我们的链接有所有的答案

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

所以用AU代替WAV

另外,请确保使用
sf\u open\u fd
not
sf\u open\u virtual
(或
sf\u open
)打开SNDFILE对象:

如果使用
sf\u open\u fd
,则libsndfile将使用
fstat
确定文件描述符是管道还是常规文件。如果使用
sf\u open\u virtual
sf\u open
,则会假定该文件是可查找的。这似乎是libsndfile中的一个缺陷,但无论如何都应该使用
sf\u open\u fd

脚注:不要打开
/dev/stdout
获取标准输出;它已打开,无需再次打开。使用文件描述符
STDOUT\u FILENO

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


wav头在这里,以防任何人需要它:

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

我认为您必须向我们展示您编写的代码。您如何打开SNDFILE?我仍然想知道您是如何使用libsndfile打开文件的,因为在我检查libsndfile源代码时,如果您在AU中使用了
sf\u open\u fd
,则永远不会返回该错误…我使用的是sf\u open(“/dev/stdout”、SFM\u WRITE、sf\u FORMAT\u AU | sf\u FORMAT\u PCM\u 16”),但它不起作用。使用
sf\u open\u fd(STDOUT\u FILENO,…)
。Libsndfile只检查具有文件描述符的管道,而不检查路径。
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) ;