今天尝试做声音输入和播放这方面的东西.
输入能捕获音频数据后, 调用播放时发现waveOutOpen这个函数返回值错误了.
之前在XP系统下, 这个函数也是这样调用的啊, 跟踪了一下, 发现返回的错误码 32.
百度, google一圈之后, 发现也有人有此问题, 但回答都没有在重点上.
最后原因找到.
原来在waveOutOpen(@hWaveOut, WAVE_MAPPER, @FFormat,
DWORD(@waveOutProc), DWORD(Self),
CALLBACK_FUNCTION);
第三个参数的格式上. 此参数取数有一定的规则.
typedef struct {
WORD wFormatTag; // WAVE_FORMAT_PCM,必须写这个。
WORD nChannels; // 单声道就设1
DWORD nSamplesPerSec; // 每秒采样,CD音质44100就可以了,你要的8000也可以。
DWORD nAvgBytesPerSec; // = nSamplesPerSec * nBlockAlign
WORD nBlockAlign; // = nChannels * wBitsPerSample / 8,因为单位是bytes。
WORD wBitsPerSample; // 分辨率,你要的是8;还可填16。
WORD cbSize; // 保留
} WAVEFORMATEX;
而且跟你输入的音频数据的采样也有一定关系. 比如我的输入采样为:
采样频率为16000,16位采样,单通道。
那么参数设置应该是这样的:
PCMFormat: TWaveFormatEx = (
wFormatTag: WAVE_FORMAT_PCM;
nChannels: 1;
nSamplesPerSec: 16000;
nAvgBytesPerSec: 32000;
nBlockAlign: 2;
wBitsperSample: 16;
cbSize: 0 );
最后, 希望能够帮助到你.
简捷安防 欢迎试用
http://www.jianjiesoft.com
网络矩阵/视频监控平台