![]() |
Stille im Musikfile suchen (nicht Anfang/Ende)
Hallo zusammen,
da dieses Forum bzw. die Mitglieder schon mehrmals behilflich waren würde ich gerne nochmals darauf zurückkommen. Ich habe nun 1 Woche vergeblich versucht, Stille in einem Audiofile zu finden (mit Bass). Im Forum gibt es ein Beispiel für "Silence am Anfang und Ende" zu definieren. Das funktioniert auch sehr gut. Allerdings verstehe ich den Code nicht bzw. kann ihn nicht adaptieren. Ich möchte z.B. 10 Sek ins File rein gehen und dann das File scannen nach einem Mute bzw. sehr leisen Sequenz. Das benötige ich um ein anderes File drauf zu legen (Nachrichten-Trenner). Ich setze also die Position des Files auf 10 Sek, soweit sogut. Aber dann komme ich auch schon nicht mehr weiter denn der Code den ich habe sucht ja nach Anfang und Ende... Hier der Code:
Code:
Kann mir jemand einen Tipp geben wie ich den Code modifizieren kann, das er mir die Stelle die den threshold unterschreitet ausgibt und die Länge des Unterschreitens?
count := 0;
chan := BASS_StreamCreateFile(False, PChar(FileName), 0, 0, BASS_STREAM_DECODE {$IFDEF UNICODE}or BASS_UNICODE{$ENDIF}); // Start-Point while Bass_ChannelIsActive(chan) <> 0 do begin b := BASS_ChannelGetData(chan, @buf, 20000); b := b div 2; a := 0; while (a < b) and (Abs(buf[a]) <= threshold) do a := a + 1; count := count + (a * 2); if (a < b) then begin while (a <> 0) and (Abs(buf[a]) > (threshold div 4)) do begin a := a - 1; count := count - 2; end; Break; end; end; StartPoint := count; // End-Point pos := BASS_ChannelGetLength(chan, BASS_POS_BYTE); while (pos > count) do begin if pos < 100000 then pos := 0 else pos := pos - 100000; BASS_ChannelSetPosition(chan, pos, BASS_POS_BYTE); b := BASS_ChannelGetData(chan, @buf, 100000); b := b div 2; a := b; while (a > 0) and (Abs(buf[a - 1]) <= (threshold div 2)) do a := a - 1; if a > 0 then begin count := pos - (a * 2); Break; end; end; EndPoint := Count; Ich sag jetzt schon mal danke! Markus * Anmerkung, eventuell ist da ein Fehler drin, es heißt in Zeile 14 "while (a <> 0) and (Abs(buf[a]) > (threshold div 4)) do", eventuell müsste es heissen "(threshold div 2)"? |
AW: Stille im Musikfile suchen (nicht Anfang/Ende)
Also mit
Delphi-Quellcode:
steuerst Du "ab wo..." und mit
BASS_ChannelSetPosition(chan, pos, BASS_POS_BYTE);
Delphi-Quellcode:
steuerst Du "wieviel...." Falls Dir das weiterhilft.
BASS_ChannelGetData(chan, @buf, 100000);
|
AW: Stille im Musikfile suchen (nicht Anfang/Ende)
Danke Dir.
Ja das ist mir klar, leider sucht er ja ab wann der Threshold überschritten wird, wenn ichs umdrehe "<kleiner Threshold" dann funktioniert es nicht ... Rechnet er am Ende zurück? |
AW: Stille im Musikfile suchen (nicht Anfang/Ende)
Hallo nochmal, lade mal bitte ein Beispiel Audio hoch und fertige dafür eine Erklärung an was am Ende mit der Beispiel-Datei passieren soll.
Weil irgendwie erinnert mich all das was Du bereits geschrieben hast an etwas was mir als Sequenzer bekannt ist. Man hat eine Liste die mit Audio-Daten gefüllt wird, der Pool. Man hat eine Graphische Darstellung, der Mixer. Im Mixer wirft man was aus Pool rein und es wird einem als Spectrum-Scan dargestellt. Im Mixer wirft man eine weitere Datei rein und zieht die an eine geeignete Position, idR da wo Pause ist, dank Spectrum sieht man ja gleich wo was laut leise ist. Das wiederholt/justiert man so lange bis man zufrieden ist. Am Ende wird im Mixer alles so abgespielt/aufgezeichnet wie man es Positioniert hat. |
AW: Stille im Musikfile suchen (nicht Anfang/Ende)
Das ist leider ein bisschen komplizierter als beim Suchen an Anfang oder Ende, denn um Stille (ich würde es eher "leise Stellen") innerhalb einer Datei zu finden, muss man nicht nur einen Threshold suchen, sondern auch nach einer bestimmten Länge, in der dieser Threshold nicht überschritten werden darf.
Denn sonst würde der Algorithmus ja bei fast jedem Nulldurchgang "Stille" vermuten. Töne sind ja bekanntlich Wellen und daher gibt es in einem Musikfile vermutlich zigtausende Stellen, an denen der Threshold unterschritten wird. Ich kann Dir hier aus Zeitgründen leider keinen passenden Code liefern, aber in Pseudo: - Lesen bis Wert unter Schwelle - Mindestanzahl von Werten weiterlesen - dabei abbrechen, wenn Wert überschritten - Lässt sich die ganze Mindestanzahl an Samples lesen hast Du einen "Stille"-Bereich gefunden. - Wenn nicht mit erstem Punkt weiter machen |
AW: Stille im Musikfile suchen (nicht Anfang/Ende)
Zitat:
Da gibt es eine Funktion die den Level über einen bestimmten Zeitraum darstellen kann. Wenn ich mich nicht irre, max 2 sec. Ich komme im Augenblick nicht an mein Delphi heran, aber in der Doku sollte man fündig werden. Gruß K-H |
AW: Stille im Musikfile suchen (nicht Anfang/Ende)
Hallo zusammen,
ja das wäre der Weg - im Endeffekt habe ich ja schon einen Code den es nur umzuschreiben gilt. Ich habe mich wund probiert wie man damit eine Silence Strecke im Audio findet, aber ich bekomms nicht hin... :-( Wünsche Euch einen schönen Abend!! Markus |
AW: Stille im Musikfile suchen (nicht Anfang/Ende)
Ich habe mich da mal reingefuchst, aber anscheinend ist meine Idee nicht so prickelnd:
Ein paar Sec ins File reingehen, nach der ersten Silence suchen und Länge abfragen... leider funktionierts nicht...
Code:
.... count := 100000; silence := 0; BASS_ChannelSetPosition(chan, count, BASS_POS_BYTE); while Bass_ChannelIsActive(chan) <> 0 do begin b := BASS_ChannelGetData(chan, @buf, 20000); b := b div 2; a := 0; while (a < b) and (Abs(buf[a]) >= threshold) do a := a + 1; count := count + (a * 2); c := count; if (c < b) then begin while (c <> 0) and (Abs(buf[c]) < (threshold div 2)) do // div4 geändert begin c := c + 1; silence := silence + 2; end; Break; end; end; FirstSilence := count; LengthSilence:= silence; |
AW: Stille im Musikfile suchen (nicht Anfang/Ende)
Hm in deinem Code sehe ich nichts von dem da:
Zitat:
|
AW: Stille im Musikfile suchen (nicht Anfang/Ende)
Dazu müsste ich das File abspielen wenn ich das richtig lese - das würde zu lange dauern (2:30 Min)...
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:36 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-2025 by Thomas Breitkreuz