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.


  • Mod

    Open recorder - waveInOpen
    Prepare - waveInPrepareHeader
    Pass down the buffer to record into - waveInAddBuffer
    Start recording - waveInStart

    Du 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 waveIn schicken?

    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.


Anmelden zum Antworten