Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Mergen von Audios (https://www.delphipraxis.net/196903-mergen-von-audios.html)

markusagb 29. Jun 2018 01:02

Mergen von Audios
 
Hallo zusammen,

ich muss 3 MP3 Audios zu einem file zusammenbauen und speichern. Ich würde das gerne mit BASS realisieren, scheitere aber seit längerem...

Die Kunst ist dabei, dass file 2 und 3 jeweils 1 Sek vor ende der vorhergehenden Datei gestartet wird, also überlappt (ohne Blenden).

Hat mir jemand einen Tipp oder Link der mir eventuell etwas helfen könnte? Die BASS Beispiele bringen mich nur bedingt weiter. Es wäre auch kein Problem die Dateien als wav zu handhaben (mit gleicher Sample-Rate und Bit), wenn es die Sache vereinfacht...

Liebe Grüße ins Forum
Markus

TiGü 29. Jun 2018 08:54

AW: Mergen von Audios
 
Die Frage ist vielleicht etwas komisch:
Ist das eine wiederkehrende Aufgabe oder handelt es sich wirklich nur um diese drei Dateien?

KodeZwerg 29. Jun 2018 10:00

AW: Mergen von Audios
 
Bass hat alle Beispiele die Du dafür brauchst im Paket.

Um aus vielen MP3s eine Solo-Audiodatei zu machen brauchst du drei Bass-Streams.
Stream 1 = Record Stream 2 + 3 (ich würde PCM/WAV schreiben lassen, geht am sichersten und ist Verlustfrei)
Stream 2 = Play
Stream 3 = Play
Stream 1 aufzeichnen lassen, Stream 2 und 3 nun abwechselnd mit neuem Audio füllen und abspielen lassen.
Irgendwann Stream 1 stoppen, fertig. Das wäre eine realtime Variante.
Wenn Du das hinbekommen hast kann man zu der gepufferten Variante kommen, das erspart grob 80-90% der Zeit da nichts über Lautsprecher abgegeben wird sondern alles nur im Speicher stattfindet.

An welcher Stelle happert es? Zeige doch mal woran Du scheiterst?! Los, trau Dich :-)

Ps: Als professionelle Lösung kann ich CoolEdit2000 (mit Studio Plugin) bzw den Nachfolger Adobe Audition sehr empfehlen!

markusagb 29. Jun 2018 19:25

AW: Mergen von Audios
 
Hallo zusammen,
vielen Dank für die Antworten. Der Process soll immer wieder abgerufen werden. Zum Verständnis, unser Radiosender soll in den Regionalnachrichten jede Stunde ein neues Nachrichtenfile bekommen mit durchwechselnden Meldungen. Die Redaktion spricht jede Meldung einzeln ein und das Programm soll 5 Min. vor der Ausstrahlung aus diesen Einzelelementen ein neues File "Würfeln". Die Überlappung ergibt sich aus den Trennern die eingebaut werden, da soll die nächste Meöldung schon auf die Hallfahne gesetzt werden (1 Sek vor Ende des Trenners).
Ich tüftle...

markusagb 29. Jun 2018 20:46

AW: Mergen von Audios
 
Soweit sogut... ich muss nur irgendwie die bassmix.dll einbinden, daran scheiterts vermutlich noch...
BASS_Mixer_StreamCreate kennt er nicht... ist wohl in der bassmix.dll drin. Aber ich habe keine Ahnung wie man das einbindet...


procedure TForm1.audiomix;
var Source1, Source2, Source3 : Cardinal;
Mixer : Cardinal;
begin
Source1 := BASS_StreamCreateFile(false, PChar('D:\Intro.wav'), 0, 0, BASS_STREAM_DECODE);
Source2:= BASS_StreamCreateFile(false, PChar('D:\Meldung1.wav'), 0, 0, BASS_STREAM_DECODE);
Source3:= BASS_StreamCreateFile(false, PChar('D:\Meldung2.wav'), 0, 0, BASS_STREAM_DECODE);

Mixer:= BASS_Mixer_StreamCreate(44100, 2, 0); => Hier ist das Problem mit dem Befehl den er nicht kennt...

BASS_Mixer_StreamAddChannel(Mixer, Source1, 0);
BASS_Mixer_StreamAddChannel(Mixer, Source2, 0);
BASS_Mixer_StreamAddChannel(Mixer, Source3, 0);

BASS_Encode_Start(Mixer, PChar('D:\Gesamt.wav'), BASS_ENCODE_PCM, nil, nil);

end;

KodeZwerg 29. Jun 2018 21:44

AW: Mergen von Audios
 
Das sieht mir nicht so aus als ob Du in die Anleitung von Bass geschaut hast. Wenn Du das machst klärt sich alles auf.
Fehlt vielleicht eine Uses Anweisung, könnte auch sein?!

markusagb 29. Jun 2018 22:39

AW: Mergen von Audios
 
Hi, fehler gefunden, danke für den Tipp mit der Doku. Die Bassenc und Bassmix pas + dll haben gefehlt, dachte die sind im Bass mit drin...

Läuft trotzdem nicht. Die Samples helfen auch nicht weiter .-(

markusagb 5. Jul 2018 00:47

AW: Mergen von Audios
 
Für alle die das Gleiche benötigen, hier der Code wie es funktioniert. Hat etwas gedauert, aber das läuft:


procedure TForm1.Audiomerge;
var Source1, Source2, Source3 : Cardinal;
Mixer : Cardinal;
duration1, duration2, duration3: double;
len:qword;
start: QWORD;
length: QWORD ;
begin
Source1 := BASS_StreamCreateFile(false, PChar('D:\Intro.wav'), 0, 0, 0 {$IFDEF UNICODE} or BASS_UNICODE or BASS_STREAM_DECODE {$ENDIF});
Source2:= BASS_StreamCreateFile(false, PChar('D:\Meldung1.wav'), 0, 0, 0 {$IFDEF UNICODE} or BASS_UNICODE or BASS_STREAM_DECODE {$ENDIF});
Source3:= BASS_StreamCreateFile(false, PChar('D:\Meldung2.wav'), 0, 0, 0 {$IFDEF UNICODE} or BASS_UNICODE or BASS_STREAM_DECODE {$ENDIF});

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

len:=BASS_ChannelGetLength(Source1, BASS_POS_BYTE);
duration1:=BASS_ChannelBytes2Seconds(Source1, len);
start:=BASS_ChannelSeconds2Bytes(mixer, 0.2);
length:=BASS_ChannelSeconds2Bytes(mixer, duration1);
BASS_Mixer_StreamAddChannelEx(mixer, Source1, 0, start, length);

len:=BASS_ChannelGetLength(Source2, BASS_POS_BYTE);
duration2:=BASS_ChannelBytes2Seconds(Source2, len);
start:=BASS_ChannelSeconds2Bytes(mixer, duration1);
length:=BASS_ChannelSeconds2Bytes(mixer, duration2);
BASS_Mixer_StreamAddChannelEx(mixer, Source2, 0, start, length);

len:=BASS_ChannelGetLength(Source3, BASS_POS_BYTE);
duration3:=BASS_ChannelBytes2Seconds(Source3, len);
start:=BASS_ChannelSeconds2Bytes(mixer, duration1+duration2);
length:=BASS_ChannelSeconds2Bytes(mixer, duration3);
BASS_Mixer_StreamAddChannelEx(mixer, Source3, 0, start, length);

BASS_ChannelPlay(mixer, false);

BASS_Encode_Start(Mixer, PChar('D:\neu.wav'), 0 {$IFDEF UNICODE} or BASS_UNICODE or BASS_ENCODE_PCM {$ENDIF}, nil, nil);

KodeZwerg 5. Jul 2018 08:17

AW: Mergen von Audios
 
Zitat:

Zitat von markusagb (Beitrag 1406522)
Source1 := BASS_StreamCreateFile(false, PChar('D:\Intro.wav'), 0, 0, 0 {$IFDEF UNICODE} or BASS_UNICODE or BASS_STREAM_DECODE {$ENDIF});
Source2:= BASS_StreamCreateFile(false, PChar('D:\Meldung1.wav'), 0, 0, 0 {$IFDEF UNICODE} or BASS_UNICODE or BASS_STREAM_DECODE {$ENDIF});
Source3:= BASS_StreamCreateFile(false, PChar('D:\Meldung2.wav'), 0, 0, 0 {$IFDEF UNICODE} or BASS_UNICODE or BASS_STREAM_DECODE {$ENDIF});

Was mir auf den Ersten Blick auffällt wäre das ich es so schreiben würde:
Delphi-Quellcode:
Source1:= BASS_StreamCreateFile(false, PChar('D:\Intro.wav'), 0, 0, 0 or BASS_STREAM_DECODE {$IFDEF UNICODE}or BASS_UNICODE{$ENDIF});
Source2:= BASS_StreamCreateFile(false, PChar('D:\Meldung1.wav'), 0, 0, 0 or BASS_STREAM_DECODE {$IFDEF UNICODE}or BASS_UNICODE{$ENDIF});
Source3:= BASS_StreamCreateFile(false, PChar('D:\Meldung2.wav'), 0, 0, 0 or BASS_STREAM_DECODE {$IFDEF UNICODE}or BASS_UNICODE{$ENDIF});

EWeiss 5. Jul 2018 08:52

AW: Mergen von Audios
 
Zitat:

Für alle die das Gleiche benötigen, hier der Code wie es funktioniert. Hat etwas gedauert, aber das läuft:
Ich möchte bezweifeln das es richtig funktioniert bei den zusammengewürfelten Variablen die du übergibst.
Wundere dich also nicht wenn ein paar Samples fehlen.

Und ich würde es so schreiben..

Delphi-Quellcode:
Source1:= BASS_StreamCreateFile(false, PChar('D:\Intro.wav'), 0, 0, 0 or BASS_STREAM_DECODE {$IFDEF UNICODE}or BASS_UNICODE{$ENDIF});

Delphi-Quellcode:
Source1:= BASS_StreamCreateFile(false, PChar('D:\Intro.wav'), 0, 0, BASS_STREAM_DECODE {$IFDEF UNICODE}or BASS_UNICODE{$ENDIF});


also was soll das mit der 0 vor dem Flag "BASS_STREAM_DECODE" (0 or BASS_STREAM_DECODE ) ist ein NOGO!
Zudem würde ich BASS_UNICODE vor dem Flag BASS_STREAM_DECODE setzen.

Dann würde ich deine Variablen prüfen.
start: QWORD..

Was denn nu QWORD, Integer, Bytes, Double ?
Du solltest dich schon für die richtige Variable entscheiden so wie in der Doku angegeben nicht einfach irgendwas.

QWord = UInt64\Int64 verlangt wird Byte oder warum denkst du heißt die Funktion BASS_ChannelSeconds2Bytes damit wir einfach mal Int64 verwenden?
Das ist aber nicht das einzige überprüfe auch mal die anderen.

gruss

KodeZwerg 5. Jul 2018 08:58

AW: Mergen von Audios
 
Spielt das bei Create() ne Rolle in welcher Reihenfolge man Dinge True setzt? Hab Bass.pas gerade nicht zur Hand.
Ja da hätte ich lieber 2x gucken müssen mit der 0, mir ist nur beim ersten Blick aufgefallen das DECODE im UNICODE block weggekapselt war.

EWeiss 5. Jul 2018 09:05

AW: Mergen von Audios
 
Zitat:

Zitat von KodeZwerg (Beitrag 1406539)
Spielt das bei Create() ne Rolle in welcher Reihenfolge man Dinge True setzt? Hab Bass.pas gerade nicht zur Hand.
Ja da hätte ich lieber 2x gucken müssen mit der 0, mir ist nur beim ersten Blick aufgefallen das DECODE im UNICODE block weggekapselt war.

Ich meinte nicht dich sondern den TE!

Eigentlich nicht aber macht sinn denn ich übergebe einen String also den Pfad zu der Datei dafür sollte ich zuerst das Flag zum prüfen Unicode oder nicht setzen und erst dann
das Flag zur Bearbeitung schließlich lese ich zuerst den Pfad und bearbeite anschließend die Datei nicht umgekehrt.

gruss

KodeZwerg 5. Jul 2018 09:07

AW: Mergen von Audios
 
:thumb:

markusagb 5. Jul 2018 20:31

AW: Mergen von Audios
 
Danke. Aus der Bass-Doku:

http://www.un4seen.com/doc/#bassmix/...ChannelEx.html

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

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

Variable start + length = QWORD

;-)

markusagb 5. Jul 2018 20:38

AW: Mergen von Audios
 
Vorschläge geändert, funktioniert genau gleich, danke dennoch!!

Ein Problem habe ich noch, das geschriebene WAV-File wird erst dann finalisiert wenn ich die Anwendung schließe. Das ist natürlich blöd. Muss ich die Streams alle freigeben bzw. gibts ne callback wenn der encoder fertig ist?

Lieber Gruß und nochmals danke an alle :-)

EWeiss 6. Jul 2018 00:34

AW: Mergen von Audios
 
Delphi-Quellcode:
QWORD start=BASS_ChannelSeconds2Bytes(mixer, 1); // delay
QWORD length=BASS_ChannelSeconds2Bytes(mixer, 2); // duration
Ok!
Dann ist die Namensgebung mit Verlaub schwachs...
Ist aber nicht dein Problem ;)

Ja du musst die HStreams freigeben versuchs einfach da kann man nicht viel falsch machen.
Den HMixer benötigst du ja zum spielen.

gruss

markusagb 7. Jul 2018 02:34

AW: Mergen von Audios
 
Danke - gelöst.

Timer mit dem BASS_MIXERPLAY starten und den Status abfragen. wenn er nicht mehr spielt dann die Streams freigeben. Vorher geht nicht da sonst der Mixer nichts mehr zum Abspielen hat.
Schönes Wochenende!!

Markus


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:00 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 by Thomas Breitkreuz