Dienstag, 28. September 2010

Ton von Mikrofon aufzeichnen

Im heutigen Post geht es um die Soundaufnahme mit einem Mikrofon. Hierfür benötigen wir in C# die WinAPI - Funktion mciSendString().
Das Media Control Interface (MCI) ist eine Schnittstelle, die Befehle zum Abspielen und Aufnehmen von Multimediadaten zur Verfügung stellt. Über vorher genannte Funktion können diese Befehle an den Computer gesendet und somit verarbeitet werden.
Die Funktion mciSendString() befindet sich in der Datei winmm.dll und kann folgendermaßen eingebunden werden (zum Einbinden von externen Bibliotheken ist folgende using - Anweisung nötig: using System.Runtime.InteropServices):

[DllImport("winmm.dll")]
private static extern int mciSendString(string lpstrCommand, string lpstrReturnString, int uReturnLength, int hwndCallback);

Die Parameter haben folgende Bedeutung:
  • lpstrCommand: zu sendender MCI - Befehl
  • lpstrReturnString: falls erforderlich, Buffer der Rückgabeinformationen empfängt
  • uReturnLength: Größe des im vorigen Parameter beschriebenen Buffers
  • hwndCallback: Handle zum Fenster, das bei Rücksprung benachrichtigt werden soll

Wir brauchen zur Steuerung des Mikrofons nur den 1. Parameter und übergeben als restliche "" bzw 0.
Zum Starten der Aufnahme müssen wir dann die beiden Befehle "open new Type waveaudio Alias recsound" und "record recsound" senden, zum Stoppen "save recsound " und "close recsound".
Und so könnte der Code einer Windows Forms-Anwendung aussehen, die über 2 Buttons verfügt, über welche die Soundaufnahme gestartet bzw. gestoppt wird:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

using System.Runtime.InteropServices;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        [DllImport("winmm.dll")]
        private static extern int mciSendString(string lpstrCommand, string lpstrReturnString, int uReturnLength, int hwndCallback);

        public Form1()
        {
            InitializeComponent();
        }

        // Starten der Aufnahme
        private void button1_Click(object sender, EventArgs e)
        {
            mciSendString("open new Type waveaudio Alias recsound", "", 0, 0);
            mciSendString("record recsound", "", 0, 0);
        }

        // Stoppen der Aufnahme
        private void button2_Click(object sender, EventArgs e)
        {
            mciSendString("save recsound C:\\records\\record1.wav", "", 0, 0);
            mciSendString("close recsound", "", 0, 0);
        }

    }
}

Kommentare:

  1. Leider funktioniert das bei mir nicht. Datei wird erzeugt ist aber leer...

    AntwortenLöschen
  2. Funktioniert dein Mirko richtig?
    Prüfe z.B. mal mit dem Windows Audio Recorder (standardmäßig unter Zubehör installiert) ob du da eine Eingabe erhälst.

    AntwortenLöschen
  3. juhu es geht :D
    vielen dank.

    AntwortenLöschen
  4. Warst du der Poster von letztem Mal bei dem die Datei leer war?
    Wenn ja, woran lag's?

    AntwortenLöschen
  5. es funktioniert ^^ danke dir

    AntwortenLöschen
  6. Ist es bei dem Code auch möglich, die Qualität der Aufnahme zu ändern (z.B. kHz oder Bitrate einstellen)?

    AntwortenLöschen
  7. Auf diese Weise nicht dass ich wüsste, tut mir leid.

    AntwortenLöschen
  8. Ich habe inzwischen herausgefunden, wie die Qualität verbessert werden kann: Es muss einfach folgender Code zwischen "open recsound" und "record recsound" gesetzt werden:

    mciSendString("open new Type waveaudio Alias recsound", "", 0, 0);
    mciSendString("set recsound TIME FORMAT MS", "", 0, 0);
    mciSendString("set recsound BITSPERSAMPLE 16", "", 0, 0);
    mciSendString("set recsound CHANNELS 2", "", 0, 0);
    mciSendString("set recsound SAMPLESPERSEC 48000", "", 0, 0);
    mciSendString("set recsound BYTESPERSEC 192000", "", 0, 0);
    mciSendString("set recsound ALIGNMENT 4", "", 0, 0);
    mciSendString("record recsound", "", 0, 0);

    Hierbei werden verschiedene Einstellungen festgelegt, die die Soundqualität erheblich verbessern.

    Das funktioniert aber nur bei Windows XP!!!

    AntwortenLöschen
    Antworten
    1. Wie finde ich sowas auch für Win Vista und Win7 ?

      Löschen
  9. Wie kann ich die aufnahme mit dem Windows Sound machen?

    AntwortenLöschen
  10. Toller Beitrag! Danke!

    AntwortenLöschen
  11. hallo,
    so spiele ich die Sounds ab

    C# CODE
    OpenFileDialog dialog1 = new OpenFileDialog();

    dialog1.Title = "Browse to find sound file to play";
    dialog1.InitialDirectory = @"c:\";
    dialog1.Filter = "Wav Files (*.wav)|*.wav";
    dialog1.FilterIndex = 2;
    dialog1.RestoreDirectory = true;

    if(dialog1.ShowDialog() == DialogResult.OK)
    {
    textBox1.Text = dialog1.FileName;
    PlaySound (dialog1.FileName, new System.IntPtr(), PlaySoundFlags.SND_ASYNC);
    }

    wie Stoppe ich das Apspielen ???

    AntwortenLöschen
  12. hallo,
    wie kann ich die .WAV Datei mit einem saveFileDialog1 speichern?

    C# Code
    saveFileDialog1.Title = "Save Soundfile";
    saveFileDialog1.FileName = "myRecord";
    saveFileDialog1.Filter = "wave|*.wav";
    saveFileDialog1.InitialDirectory = @"Record";


    if (saveFileDialog1.ShowDialog() == DialogResult.OK)
    {
    Hier fehlt der Code !!!
    textBox1.Text = saveFileDialog1.FileName;
    }

    AntwortenLöschen
  13. Hey, bei mir entsteht keine Datei. Sollte es ja eigentlich erstellen, auch wenn ichs aufnehme, dann wäre sie einfach leer aber das ist ja auch nicht so schlimm..

    AntwortenLöschen
    Antworten
    1. auch wenn ich nichts* aufnehme, meine ich sorry

      Löschen