Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Stille im Musikfile suchen (nicht Anfang/Ende) (https://www.delphipraxis.net/197433-stille-im-musikfile-suchen-nicht-anfang-ende.html)

markusagb 6. Aug 2018 23:49

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:
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;
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?

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)"?

KodeZwerg 7. Aug 2018 06:44

AW: Stille im Musikfile suchen (nicht Anfang/Ende)
 
Also mit
Delphi-Quellcode:
BASS_ChannelSetPosition(chan, pos, BASS_POS_BYTE);
steuerst Du "ab wo..." und mit
Delphi-Quellcode:
BASS_ChannelGetData(chan, @buf, 100000);
steuerst Du "wieviel...." Falls Dir das weiterhilft.

markusagb 7. Aug 2018 07:43

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?

KodeZwerg 7. Aug 2018 08:43

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.

freejay 7. Aug 2018 12:59

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

p80286 7. Aug 2018 13:11

AW: Stille im Musikfile suchen (nicht Anfang/Ende)
 
Zitat:

Zitat von freejay (Beitrag 1409999)
Denn sonst würde der Algorithmus ja bei fast jedem Nulldurchgang "Stille" vermuten.

Das Problem hast Du bei BASS nicht.
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

markusagb 7. Aug 2018 18:57

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

markusagb 8. Aug 2018 14:11

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;

freimatz 8. Aug 2018 14:57

AW: Stille im Musikfile suchen (nicht Anfang/Ende)
 
Hm in deinem Code sehe ich nichts von dem da:
Zitat:

Zitat von p80286 (Beitrag 1410003)
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.


markusagb 8. Aug 2018 15:46

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:34 Uhr.
Seite 1 von 2  1 2      

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