Einzelnen Beitrag anzeigen

Benutzerbild von Flocke
Flocke

Registriert seit: 9. Jun 2005
Ort: Unna
1.172 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#7

Re: Zwei Stereo Streams zusammenmischen

  Alt 30. Jul 2005, 18:17
Zitat von xaromz:
Wenn der Wert größer als 65535 ist, dann ist der Wert zu groß und Du musst ist stutzen, so dass er kleiner oder gleich 65535 ist.
16-Bit Audiosamples werden vorzeichenbehaftet gespeichert, der Wert muss also zwischen -32768 und +32767 liegen.

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;
Volker
  Mit Zitat antworten Zitat