Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi WAV-Dateien verschmelzen (https://www.delphipraxis.net/131765-wav-dateien-verschmelzen.html)

LDericher 30. Mär 2009 17:44


WAV-Dateien verschmelzen
 
Hallo DP!

Meine Frage ist eigentlich recht einfach: Wie verschmelze ich zwei (oder mehrere) WAV-Dateien und gebe diese danach aus ohne sie speichern zu müssen?
An eine sequentielle Ausgabe habe ich auch schon gedacht, aber die Pausen sind unvermeidlich.

Ich habe mir dazu folgende grundlegende Gedanken gemacht:

- Overhead der benötigten Dateien abschneiden
- Dateien nacheinander in einen Stream packen
- Neuen Overhead generieren, falls nötig
- Stream als WAV-Signal ausgeben/freigeben: Die einmalige Ausgabe genügt.

Das einzige verbleibende Problem ist die Umsetzung, da ich in diesen Bereichen recht unerfahren bin. Ich hoffe einfach mal, dass sich irgendwer hier mit Audioproblemen auskennt und antwortet ;)

Frohes Schaffen(:P) und danke schonmal im Voraus,
Euer LDer

SirThornberry 30. Mär 2009 18:38

Re: WAV-Dateien verschmelzen
 
was verstehst du unter "verschmelzen"? Nach was hast du bereits gesucht und in wie weit bist du mit der Theorie und dem wav-Format vertraut?

LDericher 30. Mär 2009 18:55

Re: WAV-Dateien verschmelzen
 
Ich will einfach mehrere WAVs nacheinander ausgeben, das geht mit BASS, werde ich schon hinkriegen.
Mein Problem ist bloß die unvermeidliche Ladepause zwischen den Wiedergaben. Die will ich überbrücken, indem ich die Dateien dynamisch zu einer mache und dann ausgebe.

Lässt sich da nicht was tricksen?

Der LDer.

igel457 30. Mär 2009 20:14

Re: WAV-Dateien verschmelzen
 
Ganz so dynamisch geht das Leider nicht, da im WAVE-Header die Länge der Datei steht. Eine ordentliche Implementierung liest nach dieser Länge keine Daten mehr ein.

Trotzdem könntest du die Daten an die Bass-Dll Streamen (irgendwie kannst du eigene Dateizugriffsmethoden festlegen). Allerdings gibt es bei der Bass.dll eine einfachere Lösung für dein Problem: Die Bass.dll unterstüztzt es, zwei Streams gleichzeitig zu öffnen. Somit können auch Effekte wie Crossfading realisiert werden.

Cyf 30. Mär 2009 20:23

Re: WAV-Dateien verschmelzen
 
Das Problem ist doch eigentlich nur, beide Dateien vorher schon im Speicher zu halten? Dann müsste doch auch per WinAPI das Ausgeben ohne nennenswerte Pause erfolgen (obwohl BASS bestimmt kompfortabler ist, hab die DLL zu meiner Schande noch nicht getestet)?

sx2008 30. Mär 2009 21:31

Re: WAV-Dateien verschmelzen
 
Die WAV-Dateien könnten doch auch eine unterschiedliche Samplingrate und/oder Bittiefe haben.
Das wäre so, als ob du ein 1/4" Tonband mit einem Band aus einer Compactkasette zusammenkleben möchtest. (geht nicht)
In der Digitaltechnik ist dann ein Resampling notwendig.
Digitale Filter ermitteln die Zwischenwerte, so dass man z.B eine Samplingrate von 16kHz auf 44,1kHz umrechnen kann,

Wishmaster 30. Mär 2009 21:32

Re: WAV-Dateien verschmelzen
 
Hi

nimm Bass.dll + BassMix.dll

Delphi-Quellcode:
var Source1, Source2 : Cardinal;
    Mixer : Cardinal;

// File1 kann mp3 sein und File2 kann wav sein
Source1 := BASS_StreamCreateFile(false, 'File1', 0, 0, BASS_STREAM_DECODE) // < So oft wie du willst
Source2:= BASS_StreamCreateFile(false, 'File2', 0, 0, BASS_STREAM_DECODE)

Mixer:= BASS_Mixer_StreamCreate(44100, 2, 0) ;

BASS_Mixer_StreamAddChannel(Mixer, Source1, 0); // < So oft wie du willst
BASS_Mixer_StreamAddChannel(Mixer, Source2, 0);

BASS_ChannelPlay(Mixer, false);
keine lade zeit! Und du musst die flags anpassen, kommt darauf an ob du das ganze Abspielen oder nur Decodieren
und als neue Datei Speichern willst. Du kannst die Source's jederzeit mit BASS_Mixer_ChannelRemove(Source1) entfernen!

Und wen du es dir einfach machen willst nimmst du bassenc.dll und schreibst deinen neuen Mix in eine neue Datei
Delphi-Quellcode:
BASS_Encode_Start(Mixer, Pchar('NewFile.wav'), BASS_ENCODE_PCM, nil, nil);
das ganze kannst du Ausbauen bis dir schlecht wird. :wink: :thumb:

LDericher 30. Mär 2009 21:44

Re: WAV-Dateien verschmelzen
 
Wenn ich dich richtig verstehe, kann ich dann ja auch 3 stück verschmelzen:

Delphi-Quellcode:
var Source1, Source2, Source3 : Cardinal;
    Mixer : Cardinal;

// File1 kann mp3 sein und File2 kann wav sein
Source1 := BASS_StreamCreateFile(false, 'File1', 0, 0, BASS_STREAM_DECODE) // < So oft wie du willst
Source2:= BASS_StreamCreateFile(false, 'File2', 0, 0, BASS_STREAM_DECODE)
Source3:= BASS_StreamCreateFile(false, 'File3', 0, 0, BASS_STREAM_DECODE)

Mixer:= BASS_Mixer_StreamCreate(44100, 3, 0) ;

BASS_Mixer_StreamAddChannel(Mixer, Source1, 0); // < So oft wie du willst
BASS_Mixer_StreamAddChannel(Mixer, Source2, 0);
BASS_Mixer_StreamAddChannel(Mixer, Source3, 0);

BASS_ChannelPlay(Mixer, false);
Wenn das so ist und auch so funtionieren sollte - Habe aktuell die sachen auf einem anderen rechner - dann kann ich damit arbeiten und markiere die frage nach testen als GELÖST.
Andernfalls natürlich nicht ;) aber ich bin mal zuversichtlich: Morgen ist mal wieder ein Tag mit zu viel Zeit... :D

Gruß vom LDer!

Edit: *Codeüberdenk*, *Räusper*, kann es sein, dass dein Code die Dateien übereinanderlegt bzw. gleichzeitig abspielt? Wenn ja, ich bräuchte sie nacheinander... Wenn das allerdings nacheinander abspielt, ... :thumb: *owt*

Cyf 30. Mär 2009 22:55

Re: WAV-Dateien verschmelzen
 
Zitat:

Zitat von sx2008
Die WAV-Dateien könnten doch auch eine unterschiedliche Samplingrate und/oder Bittiefe haben.
Das wäre so, als ob du ein 1/4" Tonband mit einem Band aus einer Compactkasette zusammenkleben möchtest. (geht nicht)
In der Digitaltechnik ist dann ein Resampling notwendig.
Digitale Filter ermitteln die Zwischenwerte, so dass man z.B eine Samplingrate von 16kHz auf 44,1kHz umrechnen kann,

Deswegen ja komplett im Speicher, so dass diese Informationen erhalten bleiben und für die API verfügbar sind.
Will man die paar Bytes sparen und es aneinander kleben, ist bei verschiedenen Samplingraten, Channeln, oder Bittiefen natürlich Konvertieren nötig und die Sache mit Länge anpassen nicht getan. (ganz abgesehen davon das WAVE so um die gefühlte 1000 überflüssige Chunks kennt und der signed/unsigned Wirrwar auch naja...)

Wishmaster 31. Mär 2009 07:09

Re: WAV-Dateien verschmelzen
 
Ok

Zitat:

Wenn ich dich richtig verstehe, kann ich dann ja auch 3 stück verschmelzen:
3 oder 20 macht kein unterschied! Abgesehen das du mehr Speicher verbrauchst.

Zitat:

Mixer:= BASS_Mixer_StreamCreate(44100, 3, 0) ;
das muss BASS_Mixer_StreamCreate(44100, 2, 0) ; heißen 2=Stereo, 1=Mono

Zitat:

kann es sein, dass dein Code die Dateien übereinanderlegt
Ja!
du kannst die aber versetzt abspielen/Legen benutze dazu BASS_Mixer_StreamAddChannelEx()

aus der Bass Hilfe

Example
Add a channel to a mixer, delaying the start by 1 second and limiting the duration to 2 seconds.

Delphi-Quellcode:
QWORD start=BASS_ChannelSeconds2Bytes(mixer, 1); // delay
QWORD length=BASS_ChannelSeconds2Bytes(mixer, 2); // duration
BASS_Mixer_StreamAddChannelEx(mixer, channel, 0, start, length); // add the channel
bei delay/start setze die Länge der ersten Datei


Tipp. Schaue dir mal die Hilfe der Bass an!


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:49 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz