Audio Recording UWP

Eigentlich ist es ganz einfach. Über das eingebaute Mikrofon schnell etwas aufnehmen. Wenn Carmen Geiss völlig talentfrei ein Album aufnimmt, dann sollte das meine UWP App doch auch. Erstens kommt es anders und zweites … Es fängt damit an, das die Beispiel aus dem Github Repository völlig overengineerd (schreibt man das so?) sind. Dann braucht eine UWP App spezielle Recht um auf das Mikro zugreifen zu können. Außerdem kann man nicht so einfach überall seine Dateien hin  speichern, wäre ja völlig unsicher.

Beides erlaubt der Entwickler im Visual Studio Projekt in der Manifest Datei

image

Der Benutzer muss beim ersten Start den Zugriff außerdem erlauben. Nur Siri oder Alexa dürfen dauerhaft lauschen.

Das UI wird einfach mit einem Kreis definiert der auf ein Tapped Event lauscht. Um den Nutzer nicht im unklaren zu lassen färbt er sich rot im Recording mode und grün, wenn fertig gespeichert.

 

Im Code wird dann der Stream für den Tonund ein Media Element benötigt, am besten als Eigenschaft der Klasse.

   1:  Dim capture As new MediaCapture
   2:  Dim buffer As new InMemoryRandomAccessStream

Da es ziemlich viele Möglichkeiten gibt Audio und auch Video Devices zu nutzen, muss man die gewünschten Einstellungen initialisieren.

   1:  Dim settings = New MediaCaptureInitializationSettings
   2:  settings.StreamingCaptureMode = StreamingCaptureMode.Audio
   3:  Await capture.InitializeAsync(settings)

Starten und Stoppen der Aufnahme ist beinahe schon intuitiv. Man gibt noch die gewünschte Tonqualität als Parameter an. Natürlich auch den armen Stream, der meinen Gesang entgegen nehmen darf.

   1:  await capture.StartRecordToStreamAsync(MediaEncodingProfile.CreateWav(AudioEncodingQuality.Low), buffer)
   2:  ....
   3:  Await capture.StopRecordAsync()

An dieser Stelle wärs für Carmen vorbei.

Ich möchte aber meinen neuen Hit “Hallo Welt” auch noch auf der lokalen Festplatte verewigen. Dazu muss ich den WinRT Stream in ein Byte Array umwandeln um ihn dann wieder einer WinRT API Funktion als Parameter zu übergeben. Wie vorher schon angeschnitten, mit einem StorageFile Objekt das in dem Fall auf meinen Ordner Musik zeigt.

   1:  Using dataReader = New DataReader(buffer.GetInputStreamAt(0))
   2:       Await dataReader.LoadAsync(buffer.Size)
   3:       Dim b(buffer.Size - 1) As Byte
   4:       dataReader.ReadBytes(b)
   5:       Dim saveFile = Await KnownFolders.MusicLibrary.CreateFileAsync(
   6:                          "audio.wav", CreationCollisionOption.FailIfExists)
   7:        Await Windows.Storage.FileIO.WriteBytesAsync(saveFile, b)
   8:  End Using

So dann steht eurer Karriere nichts mehr im Wege.

Kommentare sind geschlossen