AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi WAV-Dateien verschmelzen

WAV-Dateien verschmelzen

Ein Thema von LDericher · begonnen am 30. Mär 2009 · letzter Beitrag vom 31. Mär 2009
Antwort Antwort
Seite 1 von 2  1 2   
Benutzerbild von LDericher
LDericher

Registriert seit: 29. Jan 2007
Ort: Erkelenz
224 Beiträge
 
Delphi 7 Enterprise
 
#1

WAV-Dateien verschmelzen

  Alt 30. Mär 2009, 18:44
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() und danke schonmal im Voraus,
Euer LDer
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#2

Re: WAV-Dateien verschmelzen

  Alt 30. Mär 2009, 19:38
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?
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von LDericher
LDericher

Registriert seit: 29. Jan 2007
Ort: Erkelenz
224 Beiträge
 
Delphi 7 Enterprise
 
#3

Re: WAV-Dateien verschmelzen

  Alt 30. Mär 2009, 19:55
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.
  Mit Zitat antworten Zitat
Benutzerbild von igel457
igel457

Registriert seit: 31. Aug 2005
1.622 Beiträge
 
FreePascal / Lazarus
 
#4

Re: WAV-Dateien verschmelzen

  Alt 30. Mär 2009, 21:14
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.
Andreas
"Sollen sich auch alle schämen, die gedankenlos sich der Wunder der Wissenschaft und Technik bedienen, und nicht mehr davon geistig erfasst haben als die Kuh von der Botanik der Pflanzen, die sie mit Wohlbehagen frisst." - Albert Einstein
  Mit Zitat antworten Zitat
Cyf

Registriert seit: 30. Mai 2008
407 Beiträge
 
Lazarus
 
#5

Re: WAV-Dateien verschmelzen

  Alt 30. Mär 2009, 21:23
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)?
Man kann einen Barbier definieren als einen, der alle diejenigen rasiert, und nur diejenigen, die sich nicht selbst rasieren.
Rasiert sich der Barbier?
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#6

Re: WAV-Dateien verschmelzen

  Alt 30. Mär 2009, 22:31
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,
  Mit Zitat antworten Zitat
Wishmaster

Registriert seit: 14. Sep 2002
Ort: Steinbach, MB, Canada
301 Beiträge
 
Delphi XE2 Architect
 
#7

Re: WAV-Dateien verschmelzen

  Alt 30. Mär 2009, 22:32
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
BASS_Encode_Start(Mixer, Pchar('NewFile.wav'), BASS_ENCODE_PCM, nil, nil); das ganze kannst du Ausbauen bis dir schlecht wird.
  Mit Zitat antworten Zitat
Benutzerbild von LDericher
LDericher

Registriert seit: 29. Jan 2007
Ort: Erkelenz
224 Beiträge
 
Delphi 7 Enterprise
 
#8

Re: WAV-Dateien verschmelzen

  Alt 30. Mär 2009, 22:44
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...

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, ... *owt*
  Mit Zitat antworten Zitat
Cyf

Registriert seit: 30. Mai 2008
407 Beiträge
 
Lazarus
 
#9

Re: WAV-Dateien verschmelzen

  Alt 30. Mär 2009, 23:55
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...)
Man kann einen Barbier definieren als einen, der alle diejenigen rasiert, und nur diejenigen, die sich nicht selbst rasieren.
Rasiert sich der Barbier?
  Mit Zitat antworten Zitat
Wishmaster

Registriert seit: 14. Sep 2002
Ort: Steinbach, MB, Canada
301 Beiträge
 
Delphi XE2 Architect
 
#10

Re: WAV-Dateien verschmelzen

  Alt 31. Mär 2009, 08:09
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!
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 06:23 Uhr.
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