これは、基本的な 2 チャネル 44.1k wav 出力をヘッダーなしで取得するのに十分な定義を持つ libasound プログラムの例です。
編集:データを wav として直接ダンプすることがうまくいくかどうかは実際にはわかりません。録音時のノイズがデータを簡単に損傷する可能性があるためです。>
EDIT2:aplay が存在して動作する場合は、それを使用して生のオーディオを出力し、それを aplay またはオーディオを再生できるものにパイプするプログラムを作成することもできます
EDIT3:ヘッダーをまったく使用しないように変更しました
-lasound がコンパイルされない場合は、-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;
}
HDMI またはその他のディスプレイ出力ポートは機能していますか?その場合は、スクリーン キャプチャ デバイスを使用してビデオとして記録し、後で処理することができます。したがって、Web カメラのフレームレートによって制限されることはありません。
データを 16 進エンコードして、ページごとに端末に出力するのはどうですか?
ページを簡単に再生成できるように、バイナリにオフセットを含むプレフィックスを追加できます (手動で修正する場合)
次に、別のコンピューターで OCR ソフトウェアを使用してページをスキャンします。
80x25 端末では、1 ページあたり 1000 バイト (接頭辞用のスペースを差し引いたもの) が生成されます。したがって、約 1000 ページでデータを取得できます。毎秒 1 ページでも、20 分未満です。
16 進エンコーディングは簡単に記述でき、生の形式のエラー訂正も提供します (有効なシンボルは 16 個のみです)。