Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Tonaufnahme

Empfohlene Antworten

Veröffentlicht

Hey weis vlt. jemand wie man eine Tonaufnahme in C programmieren kann?

mit mciSendString?

Kennt vlt. jemand den Quelltext?

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

Bitte keine Vollzitate

Gibt es vlt. nicht einen leichteren Quelltext?

Bearbeitet von Klotzkopp
Vollzitat entsorgt

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.

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).

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;

}

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

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.

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.