3

できれば libsndfile を使用して、音声データを stdout に書き込みたいと考えています。/dev/stdout に WAV を出力すると、なんとかヘッダーを書き込めるのですが、エラーが発生します。

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 代わりに、同じ Illegal seek エラーが発生します。

完全にシークせずに書き込める音声ファイル形式はありますか?

私はLinuxを使用しています。

編集:明らかかもしれませんが、RAW形式は(シークなしで)機能します。残念ながら、サンプル レートなどのメタ情報を含む形式が必要です。

4

3 に答える 3

3

その FAQ を読み終える必要があります...あなたが私たちに与えるリンクにはすべての答えがあります。

ただし、パイプに書き込むように特別に設計されたファイル形式 (AU) が少なくとも 1 つあります。

WAV ではなく AU を使用してください。

また、 (または)ではなくsf_open_fd、でSNDFILE オブジェクトを開いていることを確認してください。 sf_open_virtualsf_open

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_virtualまたはを使用sf_openすると、ファイルがシーク可能であると見なされます。sf_open_fdこれは libsndfile の欠陥のようですが、とにかく使用する必要があります。

脚注:/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 がファイルを閉じた後、一時ファイルを stdout にストリーミングすることができます。

于 2011-12-03T23:51:46.977 に答える