ZeroCool8 Geschrieben 2. Juni 2010 Teilen Geschrieben 2. Juni 2010 Hey weis vlt. jemand wie man eine Tonaufnahme in C programmieren kann? mit mciSendString? Kennt vlt. jemand den Quelltext? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Crush Geschrieben 2. Juni 2010 Teilen Geschrieben 2. Juni 2010 (bearbeitet) Ist nicht so schön sortiert, weil ich mir das aus alten Sources zusammenkopiert habe, aber es funktioniert, Du mußt nur wissen, wie lang der Sound maximal sein soll (Millisekunden eintragen) Wie Du siehst ist es nicht ganz so simpel, wie man es sich vielleicht vorstellt. Und das ist nur die Aufnahme =8-D ... ok, die Wiedergabe ist mit PlaySound() recht simpel machbar. MCI_OPEN_PARMS mciOpenParms; MCI_RECORD_PARMS mciRecordParms; MCI_SAVE_PARMS mciSaveParms; MCI_PLAY_PARMS mciPlayParms; MCI_WAVE_SET_PARMS set_parms; mciOpenParms.lpstrAlias = "waveaudio"; mciSaveParms.lpfilename = ""; mciRecordParms.dwFrom = 0; mciRecordParms.dwTo = 2000; // Aufnahmedauer in Millisekunden mciOpenParms.lpstrDeviceType = "waveaudio"; mciOpenParms.lpstrElementName = ""; mciSendString("set capture channels 1",0,0,0); mciSendString("set waveaudio quality high", 0, 0, 0); mciSendString("set waveaudio bitspersample 16", 0, 0, 0); mciSendString("set waveaudio bytespersec 22050", 0, 0, 0); mciSendString("set capture bytespersec 22050", 0, 0, 0); mciSendString("set bytespersec 22050", 0, 0, 0); if (mciSendCommand(0, MCI_OPEN, MCI_OPEN_ELEMENT | MCI_OPEN_TYPE,(DWORD)(LPVOID) &mciOpenParms)) return; // irgendeine Fehlerbehandlung else { MCIDEVICEID wDeviceID = mciOpenParms.wDeviceID; { set_parms.wFormatTag = WAVE_FORMAT_PCM; // Soundformat set_parms.wBitsPerSample = 16; set_parms.nChannels = 1; set_parms.nSamplesPerSec = 22050; set_parms.nAvgBytesPerSec = ((set_parms.wBitsPerSample)/8) * set_parms.nChannels * set_parms.nSamplesPerSec; set_parms.nBlockAlign = ((set_parms.wBitsPerSample)/8) * set_parms.nChannels; if (mciSendCommand( wDeviceID, MCI_SET, MCI_WAIT | MCI_WAVE_SET_FORMATTAG | MCI_WAVE_SET_BITSPERSAMPLE | MCI_WAVE_SET_CHANNELS | MCI_WAVE_SET_SAMPLESPERSEC | MCI_WAVE_SET_AVGBYTESPERSEC | MCI_WAVE_SET_BLOCKALIGN, (DWORD)(LPVOID)&set_parms)) if (mciSendCommand(wDeviceID, MCI_RECORD, MCI_TO | MCI_WAIT, (DWORD)(LPVOID) &mciRecordParms)) { mciSendCommand(wDeviceID, MCI_CLOSE, 0, NULL); return; } mciSaveParms.lpfilename = "irgendwas.wav"; if (mciSendCommand(wDeviceID, MCI_SAVE, MCI_SAVE_FILE, (DWORD)(LPVOID) &mciSaveParms)) { mciSendCommand(wDeviceID, MCI_CLOSE, 0, NULL); return; } } mciSendCommand(wDeviceID, MCI_CLOSE, 0, NULL); } Bearbeitet 2. Juni 2010 von Crush Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
ZeroCool8 Geschrieben 3. Juni 2010 Autor Teilen Geschrieben 3. Juni 2010 (bearbeitet) Bitte keine Vollzitate Gibt es vlt. nicht einen leichteren Quelltext? Bearbeitet 3. Juni 2010 von Klotzkopp Vollzitat entsorgt Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 3. Juni 2010 Teilen Geschrieben 3. Juni 2010 Gibt es vlt. nicht einen leichteren Quelltext?Es gibt leider keine Funktion, die mittels Gedankenlesen herausfindet, von welchem Audiogerät in welchem Audioformat in welche Datei du aufnehmen willst. Gewöhne dich daran, dass bestimmte Aufgaben, die für den Benutzer ganz einfache oder alltägliche Vorgänge sind, in Programmform sehr sehr aufwändig sein können. Du kannst froh sein, dass dir bei diesem Problem das MCI-Subsystem den größten Teil der Arbeit abnimmt. Mit DirectSound könnte man das auch machen, aber der Code wird ähnlich lang sein, wenn nicht gar länger. Es wird seinen Grund haben, dass das Audiorecorder-Tool von Windows, das ja im Grunde nichts weiter tut als das, was du da haben möchtest, über 100 KByte groß ist. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Crush Geschrieben 3. Juni 2010 Teilen Geschrieben 3. Juni 2010 Das hier war die kleinste Variante, die ich geschafft habe. Wie Klotzkopp gesagt hat, ist das ganze mit DirectSound doch noch mal wesentlich umfangreicher und umständlicher (auch schon ausprobiert). Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
ZeroCool8 Geschrieben 3. Juni 2010 Autor Teilen Geschrieben 3. Juni 2010 Es gibt leider keine Funktion, die mittels Gedankenlesen herausfindet, von welchem Audiogerät in welchem Audioformat in welche Datei du aufnehmen willst. Gewöhne dich daran, dass bestimmte Aufgaben, die für den Benutzer ganz einfache oder alltägliche Vorgänge sind, in Programmform sehr sehr aufwändig sein können. Du kannst froh sein, dass dir bei diesem Problem das MCI-Subsystem den größten Teil der Arbeit abnimmt. Mit DirectSound könnte man das auch machen, aber der Code wird ähnlich lang sein, wenn nicht gar länger. Es wird seinen Grund haben, dass das Audiorecorder-Tool von Windows, das ja im Grunde nichts weiter tut als das, was du da haben möchtest, über 100 KByte groß ist. Der Code ist viel einfacher : #include <stdio.h> #include <stdlib.h> #include <windows.h> int start_new_record() { mciSendString("OPEN NEW TYPE WAVEAUDIO ALIAS Audiorekorder",0,0,0); mciSendString("set Audiorekorder time format ms",0,0,0); mciSendString("set Audiorekorder channels 1",0,0,0); mciSendString("set Audiorekorder bitspersample 8",0,0,0); mciSendString("record Audiorekorder",0,0,0); } int pause_record() { mciSendString("pause Audiorekorder",0,0,0); } int resume_record() { mciSendString("resume Audiorekorder",0,0,0); } int save_record(char *Dateiname) { char cmd[500]; wsprintf(cmd,"save Audiorekorder %s",Dateiname); mciSendString(cmd,0,0,0); } int close_record() { mciSendString("stop Audiorekorder",0,0,0); mciSendString("close Audiorekorder",0,0,0); } int main(int argc, char *argv[]) { char Datei[900]; int Wahl=0; do { if(Wahl==0 ||Wahl==2) { printf("Wie soll die wav-Datei heissen, die Sie erstellen wollen:\n"); scanf("%s",&Datei); getchar(); system("Cls"); } if(Wahl==0 || Wahl==1 || Wahl==2) { system("Cls"); printf("Wenn Sie die Aufnahme starten(fortfuehren) moechten, druecken Sie Enter. Wenn Sie die Aufnahme stoppen oder beenden wollen, druecken Sie noch einmal Enter."); getch(); system("Cls"); printf("Die Aufnahme laeuft! Druecken Sie Enter um diese zu stoppen."); if(Wahl==0 || Wahl==2) start_new_record(); if(Wahl==1) resume_record(); getch(); pause_record(); } system("Cls"); printf("Sie haben folgende Moeglichkeiten:\n\n"); printf("<1>Aufnahme fortsetzen\n"); printf("<2>Aufnahme neu starten\n"); printf("<3>Aufnahme speichern\n"); printf("<4>Aufnahme beenden ohne zu speichern(Programm wird beendet)\n"); printf("<5>Programm beenden\n\n"); printf("Ihre Wahl: "); scanf("%d",&Wahl); getchar(); system("Cls"); if(Wahl==2 || Wahl==4 || Wahl==5) close_record(); if(Wahl==3) { save_record(Datei); system("Cls"); printf("Die Aufnahme wurde gespeichert! Druecken Sie Enter um zurueck ins Menu zu gelangen."); getch(); } }while(Wahl!=4 && Wahl!=5); return 0; } Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Crush Geschrieben 3. Juni 2010 Teilen Geschrieben 3. Juni 2010 (bearbeitet) Wenn Du bei mir das Speichern entfernst und ein paar unnötige Variablen in einem Command zusammenfäßt, hast Du bei mir das gleiche Ergebnis. Ich habe das ganze aus mehreren Stücken zusammenkopiert, daher kann sicher das ein oder andere für eine reine Aufnahme überflüssig sein. Du könntest z.B. die ganzen Structs mit Initialisierung unter den Tisch fallen lassen. Die Fehlerbehandlung ist auch bei Dir nicht vorhanden. Wie es scheint hast Du nicht die Programmiererfahrung, um so etwas selber im Code zu erkennen oder vorzunehmen, sonst hätte sich der letzte Post erübrigt. Bearbeitet 3. Juni 2010 von Crush Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
ZeroCool8 Geschrieben 3. Juni 2010 Autor Teilen Geschrieben 3. Juni 2010 Wenn Du bei mir das Speichern entfernst und ein paar unnötige Variablen in einem Command zusammenfäßt, hast Du bei mir das gleiche Ergebnis. Ich habe das ganze aus mehreren Stücken zusammenkopiert, daher kann sicher das ein oder andere für eine reine Aufnahme überflüssig sein. Du könntest z.B. die ganzen Structs mit Initialisierung unter den Tisch fallen lassen. Die Fehlerbehandlung ist auch bei Dir nicht vorhanden. Wie es scheint hast Du nicht die Programmiererfahrung, um so etwas selber im Code zu erkennen oder vorzunehmen, sonst hätte sich der letzte Post erübrigt. Ja das stimmt ich habe keine Programmiererfahrungen. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.