voici un exemple de programme libasound avec juste assez de définitions pour obtenir une sortie wav 44.1k de base à 2 canaux sans les en-têtes.
EDIT :Je ne sais pas si le vidage direct des données au format wav fonctionnerait, car le bruit lors de l'enregistrement pourrait facilement l'endommager, mais vous pouvez probablement faire quelque chose comme une onde sinusoïdale de bits à haute fréquence qui est plus fiable
EDIT2 :si aplay est présent et fonctionne, vous pouvez également l'utiliser et simplement écrire un programme qui produit de l'audio brut et le diriger vers aplay ou tout ce qui peut lire de l'audio
EDIT3 :modifié pour ne pas utiliser d'en-têtes du tout
si -lasound ne compile pas, ajoutez -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;
}
Votre port HDMI ou tout autre port de sortie d'affichage fonctionne-t-il ? Si tel est le cas, vous pouvez utiliser un périphérique de capture d'écran pour l'enregistrer en tant que vidéo et traiter ultérieurement. Ainsi, ne pas être limité par le framerate de votre webcam.
Que diriez-vous d'encoder vos données en hexadécimal et de les envoyer page par page au terminal ?
Vous pouvez ajouter un préfixe avec le décalage dans le binaire afin de pouvoir facilement régénérer une page (pour une correction manuelle ?)
Ensuite, sur un autre ordinateur, utilisez un logiciel OCR pour numériser les pages.
Le terminal 80x25 donnerait 1000 octets par page (moins un peu d'espace pour le préfixe). Donc, en environ 1000 pages, vous pourriez sortir vos données. Même à une page par seconde, cela fait moins de 20 minutes.
Le codage hexadécimal est facile à écrire et fournit également une forme brute de correction d'erreur (il n'y a que 16 symboles valides).