![]() |
Zwei Stereo Streams zusammenmischen
Hallo,
wie kann ich zwei Stereostreams zusammenmischen? So geht es mit zwei Monostreams (Ergebnis ein Stereo Stream):
Delphi-Quellcode:
Was muss ich ändern, um zwei Stereostreams Mischen zu können?
function TForm1.SoundStreamsMischenMono(Stream1, Stream2: PSmallInt): PSmallInt;
var i: integer; Data2, Data3, Data4, Ziel, Ziel2: PSmallInt; begin Ziel := 0; Ziel2 := 0; Data2 := 0; Data4 := 0; GetMem(Ziel, Size * 2); Ziel2 := Ziel; Data2 := Stream1; Data4 := Stream2; for i := (Size div 2) - 1 downto 0 do begin ziel2^ := Data2^; Inc(Ziel2); Inc(Data2); ziel2^ := Data4^; Inc(Ziel2); Inc(Data4); end; Result := Ziel; end; // SoundStreamsMischen (TForm1) Dankeschön! Six |
Re: Zwei Stereo Streams zusammenmischen
Also in deinem Beispiel mixt du zwei Mono-Streams zu einem Stereo-Stream zusammen.
Mono-Stream: jeweils ein 16-Bit-Wert je Sample Stereo-Stream: jeweils zwei 16-Bit-Werte je Sample, abwechselnd links und rechts. Das Zusammenmischen von Audiodaten ist normalerweise eine einfache Addition, wobei du aber auf Überlauf prüfen oder ggf. eine Anpassung der Lautstärke machen musst.
Delphi-Quellcode:
Frage: woher kommt die Variable Size?
function TForm1.SoundStreamsMischenStereo(Stream1, Stream2: PSmallInt): PSmallInt;
var i: integer; Data2, Data3, Data4, Ziel, Ziel2: PSmallInt; begin GetMem(Ziel, Size); Ziel2 := Ziel; Data2 := Stream1; Data4 := Stream2; for i := Size - 1 downto 0 do begin ziel2^ := (Data2^ + Data4^) div 2; // Halbe Lautstärke -> kein Überlauf möglich Inc(Ziel2); Inc(Data2); Inc(Data4); end; Result := Ziel; end; |
Re: Zwei Stereo Streams zusammenmischen
Hi Flocke,
Danke für deine Hilfe, ich werde es gleich mal testen. Size ist eine Globale Variable. Gruß Six |
Re: Zwei Stereo Streams zusammenmischen
Hallo,
Zitat:
Werte Zusammenzählen. Wenn die Werte zu groß sind, den Wert mittels eines Faktors zurechtstutzen (z.B. mit 0.5 malnehmen). Nun bei jeder weiteren Addition den Faktor erhöhen, bis der Faktor wieder Eins ist oder eben gegebenenfalls den Faktor wieder anpassen, wenn das Ergebnis zu groß ist. Damit wird dein Stream nicht zu leise, und plötzliche Lautstärkewechsel werden vermieden. Den Anstieg des Faktors am besten ausprobieren oder per Eingabe abfragen. Je kleiner die Erhöhung, desto weniger "unruhig" ist der Lautstärkeverlauf, aber die Lautstärke bzw. die Dynamik geht etwas flöten. Gruß xaromz |
Re: Zwei Stereo Streams zusammenmischen
Hi xaromz,
Zitat:
Gruß Six |
Re: Zwei Stereo Streams zusammenmischen
Hallo,
Zitat:
Gruß xaromz |
Re: Zwei Stereo Streams zusammenmischen
Zitat:
Außerdem ist eine dynamische Signalanpassung ein etwas kompliziertes Unterfangen für jemanden, der zu Beginn der Fragestellung nicht wusste, wie man zwei Audiosignale mischt. @Six: Wenn du die kompletten Audiostreams auf einen Schlag verarbeitest, dann kannst du zunächst den maximalen absoluten Sample-Wert berechnen, der bei der Addition der beiden Streams herauskommt. Danach kannst du dann einen Faktor <= 1 berechnen, so dass dieser Wert 32767 nicht übersteigt. Dafür bräuchtest du dann zwei Durchläufe. Beispiel (ungetestet):
Delphi-Quellcode:
function TForm1.SoundStreamsMischenStereo2(Stream1, Stream2: PSmallInt): PSmallInt;
var i, n, d, v: integer; Data2, Data3, Data4, Ziel, Ziel2: PSmallInt; begin n := 32767; d := 32767; // Erster Durchlauf: d (Divisor) anpassen Data2 := Stream1; Data4 := Stream2; for i := Size - 1 downto 0 do begin v := Data2^ + Data4^; if v > d then d := v else if -v > d then d := -v; Inc(Data2); Inc(Data4); end; // Zweiter Durchlauf: Ziel berechnen, mit Pegelanpassung GetMem(Ziel, Size); Ziel2 := Ziel; Data2 := Stream1; Data4 := Stream2; for i := Size - 1 downto 0 do begin ziel2^ := (Data2^ + Data4^) * n div d; Inc(Ziel2); Inc(Data2); Inc(Data4); end; Result := Ziel; end; |
Re: Zwei Stereo Streams zusammenmischen
Zitat:
Zitat:
Gruß xaromz |
Re: Zwei Stereo Streams zusammenmischen
Danke euch beiden, ich werde das jetzt mal testen!
Gruß Six |
Re: Zwei Stereo Streams zusammenmischen
Zitat:
Beispiel: du willst N Samples auf die halbe Lautstärke reduzieren, die sind aber alle 0 (also Stille). Dann kriegst du danach N Samples mit dem Wert -16384.
Code:
Y := ((X + 32768) / 2) - 32768;
((0 + 32768) / 2) - 32768 = 32768 / 2 - 32768 = 16483 - 32768 = -16384 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:44 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz