Abmischen zweier WAV Samples?



  • Sofern die Samplerate und Frequenz dieselbe ist kann man in der Tat ganz simpel die Samplewerte der beiden einfach addieren. Das halbieren bringt dabei glaube ich nicht sonderlich viel.

    (Ich würde vermuten das DirectShow da schon was nettes bietet.
    Schau dir mal z.B. via graphedit.exe an (liegt im Windows SDK rum) ob es da schon nette DirectShow-Filter gibt.)



  • Das Halbieren verhindert dass man Samplewerte clippen muss.
    Wenn das kein Problem sein sollte kann man darauf verzichten, sollte dann aber "manuell" Clippen, da man sonst statt Clipping einen Überlauf bekommt was dann WIRKLICH schrecklich klingt.



  • @geeky
    hab ich schon, das ganze beruht auf DirektX-DirectShow, gibts nichts zu und ich wollte nen eigenen Filter schreiben, was aber tulus ist, da ich dann gleich fest impletieren kann, da ich eh mit dem Samplegrabber die daten bekomme, es geht nicht nur um Ton auch um Bild, wird eine Producersoftware für Web-TV Live Events, mit Bild ist kein Thema, da mach ich faxen mit wo die Augen raus fallen, aber von Audio habe ich null ahnung.

    Also dürfte es genügen wenn ich bei 16bit Samples die werte Addiere, und zur Lautstärke anpassung etwas clippe (absetzte) oder gar dividiere durch 2.
    Dazu muß ich 2 Chars (Bytes) erfassen, weiß einer wie bei einer Wave diese Bytes die folge haben, Big- oder Little Endian?

    Wenn ich das jetzt so sehe, und es stimmt, so beschreiben 16Bit einen Rauschausschlag, welchen ich eben absetzten könnte prozentual, und auch so Mischen.

    /* Pseudocode */
    for (...... s+=2) {
    char h = buf[s];
    char l = buf[s+1];
    short samp = (short)h << 8;
    samp = samp | (short)l;
    char h2 = buf2[s];
    char l2 = buf2[s+1];
    short samp2 = (short)h2 << 8;
    samp2 = samp2 | (short)l2;
    short sum = (samp + samp2) / 1.5; // clipp ohne check auf 0xFFFF is eh preview
    }
    


  • Du hast denke ich den Begriff "clippen" falsch verstanden.
    Clipping bedeutet dass du zu grosse/kleine Werte oben/unten abschneidest.
    Also z.B.

    int sample = source1 + source2; // mischen
    sample = min(max(sample, -32768), 32767); // signed 16 bit sample clippen
    

    Wenn es eine proffessionelle Software werden soll würde ich evtl. für beide Quellen einen unterschiedlichen Multiplikator ("Lautstärkeregler") vorsehen, am besten Fixkomma (schnell & genau & gut).

    Ahja, .WAV Dateien haben normalerweise die gleiche "endiannes" wie Intel x86 CPUs, also Little Endian wenn ich mich nicht irre. Wenn das .WAV File mit "RIFX" statt "RIFF" anfängt ist es allerdings Big Endian, d.h. du musst alle Werte "swappen" (nicht nur die Samples, auch die Länge etc.)

    Soundkarten für den PC liefern üblicherweise auch Little Endian. Im Normalfall kann man die Werte also einfach so verwenden.

    Wie es mit anderen Formaten aussieht musst du selbst nachgucken.

    Wenn ich das jetzt so sehe, und es stimmt, so beschreiben 16Bit einen Rauschausschlag, welchen ich eben absetzten könnte prozentual, und auch so Mischen.

    Ich kenne mich schon etwas mit Audio-Programmierung aus, aber was du damit meinst (Rauschen? Absetzen? Von der Steuer?) entgeht mir denke ich.

    Falls du das meinst: Ein Samplewert bestimmt einfach gesagt die Spannung die am Ausgang der Soundkarte zu einem bestimmten Zeitpunkt anliegt. Die Sample-Frequenz bestimmt dabei wie schnell "von einem Sample zum Nächsten" weitergeschaltet wird. Die Lautstärke kann man dabei regeln indem man diese Werte (und dadurch die Spannung die erzeugt wird) durch einen bestimmten Wert dividiert, bzw. mit einem bestimmten Wert multipliziert. Eine Division durch 2 bewirkt dass das was dann vom Lautsprecher gespielt wird um 6dB leiser ist, eine Division durch 10 macht es um 20dB leiser etc.

    Und Mischen erfolgt einfach durch Addition, da ist nix "prozentuelles" dabei.



  • @Hustbaer
    habs mit dem Clippen schon Begriffen, nur schlecht selbst wieder gegeben, und danke für deine Ausfürliche Info.
    Also ist das ganze doch einfach zu realisieren und ich brauch mir bei der Umsetzung keine Gedanken machen. Wie gesagt habe ich von Audio keine Ahnung, wichtig ist mir da auch nur, das ich den empfangenen MP3 Stream des "Talkgast" in Wave wandle, mein Capture des Mic in MP3 zum Gast sende und ebenfalls auf Wave ebene mische mit dem des Gast und als MP3 mit Video muxe und zum mediaserver sende. Und mit Lautstärkenanpassung kann ich das ganze auch noch versehen, Super.

    Mit Absetzten meinte ich die Lautstärke durch einen Faktor, eben halt ein Fixkoma wert wie in meinem Pseudocode.
    Danke dir für die Info.



  • (a+b)/2 ist ziemlich falsch beim Audio mischen. Sollte man nicht tun.



  • ******* schrieb:

    (a+b)/2 ist ziemlich falsch beim Audio mischen. Sollte man nicht tun.

    Was für ein tolles Kommentar 🙄



  • Zu dem durch 2 teilen gabs mal irgendwann nen Thread im "Rund um die Programmierung" - Ich find ihn allerdings nicht mehr wieder. Wenn ich wenigstens noch den Inhalt wiedergeben könnte ;/



  • geeky schrieb:

    Zu dem durch 2 teilen gabs mal irgendwann nen Thread im "Rund um die Programmierung" - Ich find ihn allerdings nicht mehr wieder. Wenn ich wenigstens noch den Inhalt wiedergeben könnte ;/

    Ich hatte hier mal was zum Wave-Verformen gefragt, vielleicht meintest du das. Ist jedenfalls auch Audio-Gewurschtel, im Endeffekt bin ich aber nicht weitergekommen 😕

    edit: Das Suchen von selber erstellten Threads ist ja ziemlich ätzend... Wer dafür ist, dass das einfacher gehen soll, einfach hier melden 😃



  • Ich habs bis jetzt nicht getestet, aber da es sich um reine Voices handeln wird in der Praxis, wird die Addition Methode mit vorstehenden Pegel Angleich, bzw. Lautstärke, vollkommen ausreichen, da vertraue ich auf die Ausagen hier.

    Was mich aber wundert, bzw. ganz weit tief in meinem Kopf schlumert, ist die Meinung das es eine WinAPI Methode gibt, event. war es auch VfW, aber ich habe die MSDN hoch und runter gewälzt, nichts.
    Kann aber auch sein das es nur darum ging, zwei Sounds gleichzeitig zu spielen, ist halt Jahre her.

    Vieleicht schreib ich mal Testweise ein DS Filter dazu und teste das mit GraphEdit, mal sehen wie ich die Zeit finde.


Anmelden zum Antworten