AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Mergen von Audios

Ein Thema von markusagb · begonnen am 29. Jun 2018 · letzter Beitrag vom 7. Jul 2018
Antwort Antwort
Seite 1 von 2  1 2      
markusagb

Registriert seit: 11. Jun 2018
46 Beiträge
 
#1

Mergen von Audios

  Alt 29. Jun 2018, 01:02
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
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.070 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Mergen von Audios

  Alt 29. Jun 2018, 08:54
Die Frage ist vielleicht etwas komisch:
Ist das eine wiederkehrende Aufgabe oder handelt es sich wirklich nur um diese drei Dateien?
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Mergen von Audios

  Alt 29. Jun 2018, 10:00
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!
Gruß vom KodeZwerg

Geändert von KodeZwerg (29. Jun 2018 um 10:21 Uhr)
  Mit Zitat antworten Zitat
markusagb

Registriert seit: 11. Jun 2018
46 Beiträge
 
#4

AW: Mergen von Audios

  Alt 29. Jun 2018, 19:25
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...
  Mit Zitat antworten Zitat
markusagb

Registriert seit: 11. Jun 2018
46 Beiträge
 
#5

AW: Mergen von Audios

  Alt 29. Jun 2018, 20:46
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;
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Mergen von Audios

  Alt 29. Jun 2018, 21:44
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?!
Gruß vom KodeZwerg

Geändert von KodeZwerg (29. Jun 2018 um 21:50 Uhr)
  Mit Zitat antworten Zitat
markusagb

Registriert seit: 11. Jun 2018
46 Beiträge
 
#7

AW: Mergen von Audios

  Alt 29. Jun 2018, 22:39
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 .-(
  Mit Zitat antworten Zitat
markusagb

Registriert seit: 11. Jun 2018
46 Beiträge
 
#8

AW: Mergen von Audios

  Alt 5. Jul 2018, 00:47
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);

Geändert von markusagb ( 5. Jul 2018 um 00:52 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: Mergen von Audios

  Alt 5. Jul 2018, 08:17
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});
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#10

AW: Mergen von Audios

  Alt 5. Jul 2018, 08:52
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..

Source1:= BASS_StreamCreateFile(false, PChar('D:\Intro.wav'), 0, 0, 0 or BASS_STREAM_DECODE {$IFDEF UNICODE}or BASS_UNICODE{$ENDIF});
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

Geändert von EWeiss ( 5. Jul 2018 um 09:30 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 22:58 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