AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Zwei Stereo Streams zusammenmischen
Thema durchsuchen
Ansicht
Themen-Optionen

Zwei Stereo Streams zusammenmischen

Ein Thema von Six · begonnen am 30. Jul 2005 · letzter Beitrag vom 31. Jul 2005
 
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, 17: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
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:41 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