aquí hay un programa libasound de ejemplo con las definiciones suficientes para obtener una salida wav básica de 44.1k de 2 canales sin los encabezados.
EDITAR:en realidad, no estoy seguro de si el volcado directo de los datos como wav funcionaría, ya que el ruido durante la grabación podría dañarlo fácilmente, pero probablemente pueda hacer algo como una onda sinusoidal de bits a alta frecuencia que es más confiable
EDIT2:si aplay está presente y funciona, también puede usarlo y simplemente escribir un programa que emita audio sin procesar y canalizarlo a unplay o cualquier cosa que pueda reproducir audio
EDIT3:lo modifiqué para que no use ningún encabezado
si -lasound no compila, agregue -L/path/where/libasound/is/located
/*
gcc alsa_noheader.c -lasound
cat stuff.wav | ./a.out
*/
typedef unsigned int uint;
typedef unsigned long ulon;
int printf(char*, ...);
void* malloc(long);
long read(int fd, void* buf, ulon count);
int snd_pcm_open(void**, char*, int, int);
ulon snd_pcm_hw_params_sizeof();
int snd_pcm_hw_params_any(void*, void*);
int snd_pcm_hw_params_set_access(void*, void*, int);
int snd_pcm_hw_params_set_format(void*, void*, int);
int snd_pcm_hw_params_set_channels(void*, void*, uint);
int snd_pcm_hw_params_set_rate_near(void*, void*, uint*, int*);
int snd_pcm_hw_params(void*, void*);
int snd_pcm_hw_params_get_period_size(void*, ulon*, int*);
long snd_pcm_writei(void*, void*, uint);
int snd_pcm_prepare(void*);
int snd_pcm_drain(void*);
int snd_pcm_close(void*);
int main(int argc, char* argv[])
{
void* pcm;
void* params;
int rate;
int nchannels;
ulon frames;
void* buf;
int bufsize;
long nread;
snd_pcm_open(&pcm, "default", 0, 0);
params = malloc(snd_pcm_hw_params_sizeof());
snd_pcm_hw_params_any(pcm, params);
/* 3 = rw_interleaved */
snd_pcm_hw_params_set_access(pcm, params, 3);
/* 2 = 16-bit signed little endian */
snd_pcm_hw_params_set_format(pcm, params, 2);
/* 2 channels */
nchannels = 2;
snd_pcm_hw_params_set_channels(pcm, params, nchannels);
/* sample rate */
rate = 44100;
snd_pcm_hw_params_set_rate_near(pcm, params, &rate, 0);
snd_pcm_hw_params(pcm, params);
snd_pcm_hw_params_get_period_size(params, &frames, 0);
bufsize = frames * nchannels * 2;
buf = malloc(bufsize);
/* read file from stdin */
while (nread = read(0, buf, bufsize) > 0)
{
if (snd_pcm_writei(pcm, buf, frames) == -29)
{
printf("W: underrun\n");
snd_pcm_prepare(pcm);
}
}
snd_pcm_drain(pcm);
snd_pcm_close(pcm);
return 0;
}
¿Funciona su HDMI o cualquier otro puerto de salida de pantalla? Si es así, puede usar un dispositivo de captura de pantalla para grabarlo como video y procesarlo más tarde. Por lo tanto, no estar limitado por la velocidad de fotogramas de su cámara web.
¿Qué tal si codificas tus datos con hexadecimal y los envías página por página a la terminal?
Puede agregar un prefijo con el desplazamiento en el binario para que pueda regenerar fácilmente una página (¿para corrección manual?)
Luego, en una computadora diferente, use algún software OCR para escanear las páginas.
El terminal de 80x25 produciría 1000 bytes por página (menos algo de espacio para el prefijo). Entonces, en aproximadamente 1000 páginas, podría obtener sus datos. Incluso a una página por segundo, son menos de 20 minutos.
La codificación hexadecimal es fácil de escribir y también proporciona una forma cruda de corrección de errores (solo hay 16 símbolos válidos).