![]() |
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 |
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? |
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! |
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... |
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; |
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?! |
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 .-( |
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); |
AW: Mergen von Audios
Zitat:
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}); |
AW: Mergen von Audios
Zitat:
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 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:59 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