Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.119.109.119] |
|
Сообщ.
#1
,
|
|
|
Пытаюсь записать звук с микрофона.Но результат не читабелен, плеерами.
#pragma pack(push,1) struct WAVEhead { char RIFF[4]; DWORD SzOfRest; char WAVE[4]; char fmt[4]; DWORD FormatSz; WAVEFORMATEX Format; char data[4]; DWORD dataSz; }; #pragma pack ( pop) { MMRESULT res=0; HWAVEIN dev; WAVEFORMATEX form={0}; form.wFormatTag=WAVE_FORMAT_PCM; form.nChannels=1; form.nSamplesPerSec=22050; form.wBitsPerSample=16; form.nAvgBytesPerSec=(form.nSamplesPerSec * form.nChannels) * ( form.wBitsPerSample/8 ); form.nBlockAlign=form.wBitsPerSample*form.nChannels/8; res=waveInOpen(&dev,WAVE_MAPPER,&form,0,0,CALLBACK_NULL); WAVEHDR wh={0}; char *buf=(char*)malloc((1024*1024)*10); wh.dwBufferLength=(1024*1024)*10; wh.dwFlags=WHDR_PREPARED; wh.lpData=buf; res=waveInPrepareHeader(dev,&wh,sizeof(wh)); res=waveInAddBuffer(dev,&wh,sizeof(wh)); res=waveInStart(dev); Sleep(5000); res=waveInReset(dev); res=waveInUnprepareHeader(dev,&wh,sizeof(wh)); res=waveInClose(dev); DWORD outSz=sizeof(WAVEhead)+wh.dwBytesRecorded; char *toOut=(char*)malloc(outSz); memset(toOut,NULL,outSz); WAVEhead *WFH=(WAVEhead *)toOut; memcpy(WFH->RIFF,"RIFF",4); WFH->SzOfRest=outSz-8; memcpy(WFH->WAVE,"WAVE",4); memcpy(WFH->fmt,"fmt",4); WFH->FormatSz=sizeof(WAVEFORMATEX); memcpy((void*) ( ( (DWORD)WFH )+16 ),&form,sizeof(WAVEFORMATEX)); memcpy(WFH->data,"data",4); WFH->dataSz=wh.dwBytesRecorded; toOut+=sizeof(WAVEhead); memcpy(toOut,buf,wh.dwBytesRecorded); toOut-=sizeof(WAVEhead); HANDLE f=CreateFile(L"test.wav",GENERIC_WRITE ,FILE_SHARE_WRITE ,0,CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL,0); if(f!=INVALID_HANDLE_VALUE) { DWORD w=0; WriteFile(f,toOut,outSz,&w,0); CloseHandle(f); } free(toOut); free(buf); } Это проблема с заголовком,или что то не то записалось? |
Сообщ.
#2
,
|
|
|
_nic, проблема однозначно с заголовком. Возьми шестнадцатеричный редактор и сравни свой файл с тем, который создает стандартная утилита для работы с микрофоном.
|
Сообщ.
#3
,
|
|
|
Цитата _nic @ memcpy((void*) ( ( (DWORD)WFH )+16 ),&form,sizeof(WAVEFORMATEX)); че-то ты тут копируешь по смещению 16 байт, а размер структуры не уменьшаешь... |
Сообщ.
#4
,
|
|
|
Все так и все не так Походу это абсолютно нереально Или все же дело в не в заголовке.
|
Сообщ.
#5
,
|
|
|
Цитата _nic @ Все так и все не так Походу это абсолютно нереально Или все же дело в не в заголовке. Ось? |
Сообщ.
#6
,
|
|
|
Цитата medved_68 @ Ось? А причём тут ось, если у него банально заголовок неправильный. |
Сообщ.
#7
,
|
|
|
_nic, сильно не вникал. Строки, случаем, не юникодные? Посмотри каким-нибудь бинарным просмотрщиком, первые 4 символа - "RIFF"?
|
Сообщ.
#8
,
|
|
|
...сталкивался с подобным при смене ansi на юникодную Delphi, тип char имел другой размер, решил принудительным заданием как ansichar или byte. Тут тоже скорее дело в заголовке. TC, приложите на форум сигнатуру вашего WAV.
|
Сообщ.
#9
,
|
|
|
Программа явно написана на C или C++. Сужу по прагме. Если _nic пишет программу не для сигнальника (что вряд-ли, там такой прагмы нет), то char имеет размер 1 байт (8 бит).
Кстати, в структуре заголовка ошибка: Описатель формата в WAVE-файле похож на структуру WAVEFORMATEX, но на 2 байта короче, в нём отсутствует поле cbSize. |