Zum Inhalt springen

Tonaufnahme


Empfohlene Beiträge

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 von Crush
Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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;

}

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 von Crush
Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...