AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Stille im Musikfile suchen (nicht Anfang/Ende)

Stille im Musikfile suchen (nicht Anfang/Ende)

Ein Thema von markusagb · begonnen am 6. Aug 2018 · letzter Beitrag vom 9. Aug 2018
Antwort Antwort
Seite 1 von 2  1 2   
markusagb

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

Stille im Musikfile suchen (nicht Anfang/Ende)

  Alt 6. Aug 2018, 23:49
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)"?

Geändert von markusagb ( 6. Aug 2018 um 23:52 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg
Online

Registriert seit: 1. Feb 2018
2.081 Beiträge
 
Delphi 2010 Professional
 
#2

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

  Alt 7. Aug 2018, 06:44
Also mit BASS_ChannelSetPosition(chan, pos, BASS_POS_BYTE); steuerst Du "ab wo..." und mit BASS_ChannelGetData(chan, @buf, 100000); steuerst Du "wieviel...." Falls Dir das weiterhilft.
Gruß vom KodeZwerg
Wenn ein unerwarteter Fehler aufgetreten ist, frage ich mich immer, welche Fehler erwartet wurden...
  Mit Zitat antworten Zitat
markusagb

Registriert seit: 11. Jun 2018
39 Beiträge
 
#3

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

  Alt 7. Aug 2018, 07:43
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?
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg
Online

Registriert seit: 1. Feb 2018
2.081 Beiträge
 
Delphi 2010 Professional
 
#4

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

  Alt 7. Aug 2018, 08:43
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.
Gruß vom KodeZwerg
Wenn ein unerwarteter Fehler aufgetreten ist, frage ich mich immer, welche Fehler erwartet wurden...
  Mit Zitat antworten Zitat
freejay

Registriert seit: 26. Mai 2004
Ort: Nürnberg
160 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#5

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

  Alt 7. Aug 2018, 12:59
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
[Delphi 10.2 Tokyo; Win10; MySQL]
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.077 Beiträge
 
Delphi 7 Personal
 
#6

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

  Alt 7. Aug 2018, 13:11
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
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
markusagb

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

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

  Alt 7. Aug 2018, 18:57
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
  Mit Zitat antworten Zitat
markusagb

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

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

  Alt 8. Aug 2018, 14:11
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;
  Mit Zitat antworten Zitat
freimatz

Registriert seit: 20. Mai 2010
395 Beiträge
 
Delphi 10.1 Berlin Professional
 
#9

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

  Alt 8. Aug 2018, 14:57
Hm in deinem Code sehe ich nichts von dem da:
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.
  Mit Zitat antworten Zitat
markusagb

Registriert seit: 11. Jun 2018
39 Beiträge
 
#10

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

  Alt 8. Aug 2018, 15:46
Dazu müsste ich das File abspielen wenn ich das richtig lese - das würde zu lange dauern (2:30 Min)...
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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:15 Uhr.
Powered by vBulletin® Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2018 by Daniel R. Wolf