Sound vom Mikrofon aufnehmen WinAPI
-
Wie?
#include <windows.h> #include <cstdio> #include <tchar.h> int main() { char lpszCommand[100]; sprintf(lpszCommand, "record %s %s %s", "mysound", "waveaudio", "wait"); printf(lpszCommand); mciSendString(lpszCommand,0,0,0); }So weit bin ich schonmal...
-
Mein Ziel ist es, eine Mikrofonübertragung per SOCKETS zu realisieren. Mit send() und recv() komme ich klar, aber ich weiß nicht genau, wie ich das aufgenommene schicke. Gibt es eine Möglichkeit, das aufgenommene in einem char Puffer zu speichern und einfach zu senden? Und das ganze möglichst ohne Zeitverlust...
-
Ach ja, in eine Datei kann ich es so schon schreiben:
mciSendString("open new Type waveaudio Alias recsound", "", 0, 0); mciSendString("record recsound", "", 0, 0); Sleep(10000); mciSendString("save recsound C:\\Users\\USER\\Desktop\\record1.wav", "", 0, 0); mciSendString("close recsound", "", 0, 0);Aber das ist, wie gesagt, nicht mein Ziel.
-
Open recorder - waveInOpen
Prepare - waveInPrepareHeader
Pass down the buffer to record into - waveInAddBuffer
Start recording - waveInStartDu hast eine entsprechenden Callback Funktion mit der man dann reagieren kann... (IMHO WIM_DATA)
-
Bin bisher soweit:
int Record(SOCKET sock) { const int NUMPTS = 44100 * 10; int sampleRate = 44100; short int waveIn[NUMPTS]; HWAVEIN hWaveIn; WAVEHDR WaveInHdr; MMRESULT result; HWAVEOUT hWaveOut; WAVEFORMATEX pFormat; pFormat.wFormatTag = WAVE_FORMAT_PCM; pFormat.nChannels = 1; pFormat.nSamplesPerSec = sampleRate; pFormat.nAvgBytesPerSec = 2 * sampleRate; pFormat.nBlockAlign = 2; pFormat.wBitsPerSample = 16; pFormat.cbSize = 0; result = waveInOpen(&hWaveIn, WAVE_MAPPER, &pFormat, 0, 0, WAVE_FORMAT_DIRECT); if(result) { return 1; } WaveInHdr.lpData = (LPSTR)waveIn; WaveInHdr.dwBufferLength = 2 * NUMPTS; WaveInHdr.dwBytesRecorded = 0; WaveInHdr.dwUser = 0; WaveInHdr.dwFlags = 0; WaveInHdr.dwLoops = 0; waveInPrepareHeader(hWaveIn, &WaveInHdr, sizeof(WAVEHDR)); result = waveInAddBuffer(hWaveIn, &WaveInHdr, sizeof(WAVEHDR)); if(result) { return 1; } result = waveInStart(hWaveIn); if(result) { return 1; } Sleep((NUMPTS/sampleRate) * 1000); //Sleep while recording //AB HIER SCHICKEN int end = 0; end = send(sock,(const char*)&waveIn,sizeof(waveIn),0); char BUUF[88]; //MessageBox(0,itoa(end,BUUF,10),0,0); waveOutUnprepareHeader(hWaveOut, &WaveInHdr, sizeof(WAVEHDR)); waveInUnprepareHeader(hWaveIn, &WaveInHdr, sizeof(WAVEHDR)); waveInClose(hWaveIn); waveOutClose(hWaveOut); return 0; }Problem ist jetzt, dass ich nicht weiß, wie ich den Puffer schicken soll. kann ich einfach das Array
waveInschicken?Gruß
-
-
ansonnsten kannst du portaudio library verwenden.. spitzen api.. dazu würde ich die übertragung noch komprimiren.. mit zum bsp. quicklz library... verschlüsseln könnte mann den stream auch.. in der heutigen zeit.