Einzelnen Beitrag anzeigen

Marco Steinebach

Registriert seit: 4. Aug 2006
491 Beiträge
 
Delphi 5 Enterprise
 
#6

Re: Stille aus Wave-Dateien entfernen?

  Alt 20. Jun 2009, 00:16
Hi Wishmaster,
Ganz herzlichen Dank für den Quellcode.
Mein Ansatz war, die Werte mittels BASS_ChannelGetLevel rauszufinden. Allerdings bin ich nicht auf die Idee gekommen, das ganze, für das Ende, rückwärts anzugehen, ich hab einfach mehrere Levels verglichen, und wenn’s 20 mal unterm threshold war, dann war schluß. Da ist deines natürlich um Längen besser.

Ich habe noch ein paar Fragen zum Code:
1. Wofür ist die möglichkeit des PreScan hier sinnvoll?
2. Warum vergleichst du auf Threshold div 2 bzw. threshold div 4?

Die Fragen, weil ich gerne verstehen würde, wie du es gemacht hast.

So, und damit man das Resultat auch als Wave-Datei hat, , hier der Rest des Programms.
Kann man das evtl. noch verbessern?

Delphi-Quellcode:
procedure TMainForm.BStartClick(Sender: TObject);
const
  Buffersize = 1024;
var
  sh: HSTREAM; // sound handle
  eh: HENCODE; // encoder handle
  buf: array of byte;
  Startposition, Endposition: dWord;
begin
  SetLength (buf, BufferSize);
  BASS_init (-1, 44100, 0, application.handle, nil);
  if not Channel_Get_SilenceLength_16Bit ('Test.wav', true, 5000, Startposition, Endposition) then
  begin
    ErrorMsg ('Calculation of silence failed!');
    exit
  end;

  sh := BASS_StreamCreateFile (false, pChar('test.wav'), 0, 0, BASS_Stream_Decode);
  if sh = 0 then
  begin
    ErrorMsg ('Could not open input file.');
    exit
  end;

  BASS_ChannelSetPosition (sh, Startposition, BASS_POS_Byte);
  eh := BASS_Encode_Start (sh, pChar('test_silent.wav'), BASS_Encode_PCM + BASS_Encode_AutoFree, nil, nil);
  if eh = 0 then
  begin
    ErrorMsg ('Encoder not started.');
    BASS_StreamFree (sh);
    exit
  end;
  While BASS_ChannelIsActive (sh) <> BASS_ACTIVE_Stopped do
  begin
    BASS_ChannelGetData (sh, buf, Buffersize);
    if BASS_ChannelGetPosition (sh, BASS_Pos_Byte) >= EndPosition then
      BASS_ChannelStop (sh);
  end;
  BASS_StreamFree (sh);
  Infobox ('Ready!');
end;
Ich hab’s auch schon mittels eine BASS_SYNC_Pos probiert, aber der Sync wird niemals erreicht.

Freundliche Grüße
Marco
Marco Steinebach
  Mit Zitat antworten Zitat