Pregunta

Quiero escribir datos de audio en Stdout, preferiblemente usando LibsndFile. Cuando salgo a WAV a /dev /stdout, me las arreglo para escribir el encabezado, pero luego recibo un error

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

Supongo que esto está relacionado con http://www.mega-nerd.com/libsndfile/faq.html#q017, algunos formatos de archivo no se pueden escribir sin buscar. Sin embargo, cuando intento emitir SF_Format_au | SF_FORMAT_PCM_16 En cambio, todavía obtengo el mismo error de búsqueda ilegal.

¿Hay algún formato de archivo de audio que se pueda escribir por completo sin buscar?

Estoy usando Linux.

Editar: puede ser obvio, pero el formato sin procesar funciona (sin buscar). Desafortunadamente, necesito un formato que tenga meta información como la frecuencia de muestreo.

¿Fue útil?

Solución

Debe terminar de leer las preguntas frecuentes ... el enlace que nos da tiene todas las respuestas.

Sin embargo, hay al menos un formato de archivo (AU) que está específicamente diseñado para ser escrito en una tubería.

Así que usa Au en lugar de WAV.

También asegúrese de abrir el objeto SndFile con sf_open_fd, y no 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) ;

Si utiliza sf_open_fd, entonces Libsndfile usará fstat Para determinar si el descriptor del archivo es una tubería o un archivo regular. Si utiliza sf_open_virtual o sf_open, asumirá que el archivo se puede solicitar. Esto parece ser una falla en Libsndfile, pero deberías estar usando sf_open_fd de todos modos.

Nota: No abre /dev/stdout Para obtener la salida estándar; Ya está abierto y no hay necesidad de abrirlo nuevamente. Usar el descriptor de archivo STDOUT_FILENO.

Otros consejos

Terminó la salida de un encabezado WAV "infinito" y luego escribiendo datos de PCM sin procesar mientras dure el audio. No es realmente válido, pero la mayoría de los jugadores parecen entender de todos modos.

El encabezado WAV está aquí, en caso de que alguien lo quiera: https://gist.github.com/1428176

Podría escribir en un archivo temp (quizás en /tmp), dejar que el libsnd busque modificar el encabezado .wav (riff) del archivo temp, y luego, después de que Libsnd ha cerrado el archivo, transmite el archivo temper a stdout.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top