Lautstärke der gerade ins Mikrofon gesprochenen Dinge



  • Ich weiß ein etwas komplizierter Titel, aber ich hoffe jeder kann sich ein ungefähres Beispiel davon machen.

    Also:
    Ich möchte in meinem Programm testen wie laut gerade ins Mikrofon gesprochen wurde.
    Wie man das aus manchen Programmen kennt, wollte ich das Ergebnis dann auf einer TProgressBar-Komponente ausgeben.

    Ist sowas möglich? Wahrscheinlich.

    Danke schonmal im voraus!



  • Du wirst wohl das Signal aufnehmen müssen, d.h. von Windows in einen von dir bereitgestellten Speicherbereich schreiben lassen (natürlich häppchenweise, immer nur ein paar KB). Der Bereich wird dann mit den Audiosamples gefüllt. Je nach Aufnahmeformat ist der Inhalt unterschiedlich zu interpretieren. Wenn du z.B. mit 16Bit Stereo aufnimmst, liegen im Speicher 16Bit-Werte abwechselnd vom linken und vom rechten Kanal. Da es eine Schwingung ist, liegt der Nullpunkt bei 32768. Einfach von jedem Sample 32768 abziehen und dann das Maximum in deinem Puffer finden. Dann hast du die momentane Lautstärke.



  • Dafür gibt's sicher eine WinAPI-Lösung.
    Verschoben dorthin.



  • Verstehe was du meinst, aber wie soll ich das anstellen.
    Wie wärs mit nem Codeschnipsel 🙂

    Ne Komponente wär natürlich am besten *faulsei* 😃
    Aber erstmal danke für die Ansätze.

    @Jansen: Gib mir bitte mal nen Such-Keyword. 🤡



  • warp schrieb:

    Du wirst wohl das Signal aufnehmen müssen, d.h. von Windows in einen von dir bereitgestellten Speicherbereich schreiben lassen (natürlich häppchenweise, immer nur ein paar KB). Der Bereich wird dann mit den Audiosamples gefüllt. Je nach Aufnahmeformat ist der Inhalt unterschiedlich zu interpretieren. Wenn du z.B. mit 16Bit Stereo aufnimmst, liegen im Speicher 16Bit-Werte abwechselnd vom linken und vom rechten Kanal. Da es eine Schwingung ist, liegt der Nullpunkt bei 32768. Einfach von jedem Sample 32768 abziehen und dann das Maximum in deinem Puffer finden. Dann hast du die momentane Lautstärke.

    so einfach ist das nicht. wenn ich das richtig verstanden habe, soll es so eine art aussteuerungsanzeige werden, oder ? wenn man da den peak, wie oben beschrieben, eines jeden blocks nimmt, wackelt die anzeige wie verrückt. man lösst solche probleme, indem man ein mittel über mehere peaks der letzten blöcke und dem aktuellen oder - noch besser - einen mittelwert über den rms ( root mean square ) eines blocks und einigen vergangenen bildet. die anzahl der vergangegen blöcke, die verwendet werden sollten, ist natürlich abhängig, von der grösse der blöcke.

    ausserdem ist wave-verarbeitung für gewöhnlich 16 bit signed (!) short ( -32k bis +32k) format - um das maximum zu finden, musst du erst einmal den block sample für sample in seinen betrag überführen - das erspart einigen aufwand bei der mittelwertberechnung bezoge auf den peak. beim rms brauchst du es nicht zu machen, da das vorzeichen eh "wegquadriert" wird.

    und ein codeschnippsel ? naja, ein waveIn + anzeige ist wohl alles andere als ein schnipsel 🙄



  • RockNix schrieb:

    und ein codeschnippsel ? naja, ein waveIn + anzeige ist wohl alles andere als ein schnipsel 🙄

    Häng dich nicht an meinen Worten auf -> Hab natürlich nichts gegen nen großen Schnipsel 😃

    Hab mich schon mal n bisschen umgesehen: waveIn is ne ziemlich kompliziert Sache.
    Ich steig da so richtig net durch und ne Komponente dafür find ich auch net.



  • also waveIn/Out ist nicht so kompliziert wie es ausschaut - du musst wie folgt vorgehen.

    1. device öffnen mit waveInOpen() - für deinen fall sollte als ID der WAVE_MAPPER reichen - und dann sollest du das ganze mit der option für eine callback waveInProc() function öffnen.

    2. dann musst du midenstens 2 buffer mit waveInPrepareHeader() anmelden

    3. device mit waveInStart() aktivieren, aber erst dann, wenn du in der callback - siehe 1) - ein WIM_OPEN bekommen hast

    4. alle buffer von 2) mit waveInAddBuffer() an den treiber übergeben

    5. in der waveInProc() - siehe 1) - gibts ein event WIM_DATA, wenn ein block gefüllt ist, dann die daten in einen buffer umkopieren und den leeren buffer wieder zurück an den treiber geben 4)

    that`s it ...

    Häng dich nicht an meinen Worten auf -> Hab natürlich nichts gegen nen großen Schnipsel

    Hab mich schon mal n bisschen umgesehen: waveIn is ne ziemlich kompliziert Sache.
    Ich steig da so richtig net durch und ne Komponente dafür find ich auch net.

    nimms nicht persönlich, aber auch so ein miniprojekt braucht seine zeit, daher kannst du nicht erwarten, dass hier mal eben einer einen fertigen code postet. hilfe bei problemen und lösungsansätze gibts hier IMMER aber es erledigt keiner die arbeit für dich 😉



  • RockNix schrieb:

    nimms nicht persönlich, aber auch so ein miniprojekt braucht seine zeit, daher kannst du nicht erwarten, dass hier mal eben einer einen fertigen code postet. hilfe bei problemen und lösungsansätze gibts hier IMMER aber es erledigt keiner die arbeit für dich 😉

    Hab ich auch nicht erwartet 😉

    Danke für die Hilfe, weiß wie du das meinst, aber in meinem Fall gibts ne leichtere Lösung.



  • Hallo, ich habe eben eine Komponente für den BCB gefunden dafür !!!
    TRecord von den AudioIn - Tools ! Super das Tei !



  • Wo gibts denn das? 😃


Anmelden zum Antworten