AGB  ·  Datenschutz  ·  Impressum  







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

Stille im Musikfile suchen (nicht Anfang/Ende)

Ein Thema von markusagb · begonnen am 7. Aug 2018 · letzter Beitrag vom 9. Aug 2018
 
markusagb

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

Stille im Musikfile suchen (nicht Anfang/Ende)

  Alt 7. Aug 2018, 00: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 ( 7. Aug 2018 um 00:52 Uhr)
  Mit Zitat antworten Zitat
 


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 16:20 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