Hier ist ein Beispiel für ein Libasound-Programm mit gerade genug Definitionen, um eine einfache 2-Kanal-44,1-k-WAV-Ausgabe ohne Header zu erhalten.
BEARBEITEN:Ich bin mir eigentlich nicht sicher, ob das direkte Ablegen der Daten als wav funktionieren würde, da Rauschen beim Aufnehmen sie leicht beschädigen könnte, aber Sie können wahrscheinlich so etwas wie eine Sinuswelle von Bits mit hoher Frequenz machen, was zuverlässiger ist
EDIT2:Wenn ein Play vorhanden ist und funktioniert, können Sie das auch verwenden und einfach ein Programm schreiben, das rohes Audio ausgibt und es in ein Play oder irgendetwas leitet, das Audio abspielen kann
EDIT3:geändert, um überhaupt keine Header zu verwenden
wenn -lasound nicht kompiliert wird, fügen Sie -L/path/where/libasound/is/located
hinzu/*
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;
}
Funktioniert Ihr HDMI oder ein anderer Display-Ausgang? In diesem Fall können Sie ein Bildschirmaufnahmegerät verwenden, um es als Video aufzunehmen und später zu verarbeiten. Somit nicht durch die Framerate Ihrer Webcam begrenzt.
Wie wäre es, wenn Sie Ihre Daten hex-codieren und Seite für Seite an das Terminal ausgeben?
Sie können ein Präfix mit dem Offset in der Binärdatei hinzufügen, sodass Sie eine Seite einfach neu generieren können (zur manuellen Korrektur?)
Verwenden Sie dann auf einem anderen Computer eine OCR-Software, um die Seiten zu scannen.
Ein 80x25-Terminal würde 1000 Bytes pro Seite ergeben (abzüglich etwas Platz für das Präfix). Auf ungefähr 1000 Seiten könnten Sie also Ihre Daten herausholen. Selbst bei einer Seite pro Sekunde sind das weniger als 20 Minuten.
Die Hex-Codierung ist einfach zu schreiben und bietet auch eine grobe Form der Fehlerkorrektur (es gibt nur 16 gültige Symbole).