Formato de archivo de audio que se puede escribir sin buscar
-
27-10-2019 - |
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.
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.