Domanda

Voglio scrivere dati audio su stdout, preferibilmente usando libndsfile. Quando output wav to /dev /stdout riesco a scrivere l'intestazione, ma poi ricevo un errore

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

Presumo che questo sia correlato a http://www.mega-nerd.com/libsndfile/faq.html#q017, alcuni formati di file non possono essere scritti senza cerchi. Tuttavia, quando provo a produrre sf_format_au | SF_FORMAT_PCM_16 Invece, ricevo ancora lo stesso errore di ricerca illegale.

Ci sono formati di file audio che possono essere scritti completamente senza cercare?

Sto usando Linux.

EDIT: potrebbe essere ovvio, ma il formato grezzo funziona (senza cercare). Purtroppo ho bisogno di un formato che abbia meta informazioni come la velocità di campionamento.

È stato utile?

Soluzione

Dovresti finire di leggere quelle FAQ ... Il link che ci dai ha tutte le risposte.

Tuttavia, esiste almeno un formato di file (AU) che è specificamente progettato per essere scritto su un tubo.

Quindi usa Au invece di WAV.

Assicurati anche di aprire l'oggetto SNDFILE sf_open_fd, e non sf_open_virtual (o sf_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) ;

Se usi sf_open_fd, quindi Libsndfile utilizzerà fstat Per determinare se il descrittore di file è un tubo o un file normale. Se usi sf_open_virtual o sf_open, presumo che il file sia richiesto. Questo sembra essere un difetto in libsndfile, ma dovresti usare sf_open_fd comunque.

Nota: Non aprire /dev/stdout per ottenere l'output standard; È già aperto e non è necessario riaprirlo. Usa il descrittore di file STDOUT_FILENO.

Altri suggerimenti

Ha terminato l'output di un'intestazione WAV "Infinite", quindi scrivere dati PCM grezzi per tutto il tempo che dura l'audio. Non è davvero valido, ma la maggior parte dei giocatori sembra capire comunque.

L'intestazione WAV è qui, nel caso in cui qualcuno lo voglia: https://gist.github.com/1428176

Potresti scrivere in un file temp (forse in /tmp), lasciare che la libsnd cerchi di modificare l'intestazione .wav (riff) del file temp, quindi dopo che Libsnd ha chiuso il file, trasmette in streaming il file temp su stdout.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top