今さらVFWのコーディングをするのもなんですが、
レガシーなコードを引き継いでちょっとしたプログラムを書いてaviファイルを作成するのに都合がいいのでメモっておきます。
EternalWindowsさんとか、ネットにわかりやすい解説がまだまだ残ってますしね。
1. レジストリの修正
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Drivers32
(64bit版はHKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows NT\CurrentVersion\Drivers32 も)
のmsacm.l3acmをl3codecp.acmに修正。
2. WAVEFORMATEX, MPEGLAYER3WAVEFORMATの設定
2チャンネル、16ビット、32000Hzの録音入力を、128khz,CBRでエンコードするときの設定
# define AUD_CAPTURE_SAMPLINGFREQUENCY 32000 // 32000Hz
# define AUD_CAPTURE_CHANNELS 2 // stereo
# define AUD_CAPTURE_BITSPERSAMPLE 16 // 16bit/sample
# define MP3_BITRATE (128*1000) // 128khz CBR
# define MP3_SAMPLESPERFRAME 1152 // mp3 v1 layerIII
# define MP3_FRAMESIZE (MP3_SAMPLESPERFRAME*(MP3_BITRATE/8)/AUD_CAPTURE_SAMPLINGFREQUENCY)
WAVEFORMATEX wfx;
memset(&wfx, 0, sizeof(WAVEFORMATEX));
wfx.wFormatTag=WAVE_FORMAT_PCM;
wfx.nChannels=AUD_CAPTURE_CHANNELS;
wfx.nSamplesPerSec=AUD_CAPTURE_SAMPLINGFREQUENCY;
wfx.wBitsPerSample=AUD_CAPTURE_BITSPERSAMPLE;
wfx.nBlockAlign=wfx.wBitsPerSample/8*wfx.nChannels;
wfx.nAvgBytesPerSec=wfx.nSamplesPerSec*wfx.nBlockAlign;
MPEGLAYER3WAVEFORMAT mp3wf;
memset(&mp3wf, 0, sizeof(MPEGLAYER3WAVEFORMAT));
mp3wf.wfx.wFormatTag=WAVE_FORMAT_MPEGLAYER3;
mp3wf.wfx.nChannels=AUD_CAPTURE_BITSPERSAMPLE;
mp3wf.wfx.nSamplesPerSec=AUD_CAPTURE_SAMPLINGFREQUENCY;
mp3wf.wfx.wBitsPerSample=0;
mp3wf.wfx.nBlockAlign=1;
mp3wf.wfx.nAvgBytesPerSec=MP3_BITRATE/8;
mp3wf.wfx.cbSize=MPEGLAYER3_WFX_EXTRA_BYTES;
mp3wf.wID=MPEGLAYER3_ID_MPEG;
mp3wf.fdwFlags=MPEGLAYER3_FLAG_PADDING_OFF;
mp3wf.nFramesPerBlock=1;
mp3wf.nBlockSize=MP3_FRAMESIZE*mp3wf.nFramesPerBlock;
mp3wf.nCodecDelay=1393;
aviに入れてvideoと同期させるのにMP3-CBRの方がコーディング上は楽なんです。
MP3のacmの変更はライセンス的にどうなんだろうってのがありますけどね。