Einzelnen Beitrag anzeigen

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