AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Stille aus Wave-Dateien entfernen?
Thema durchsuchen
Ansicht
Themen-Optionen

Stille aus Wave-Dateien entfernen?

Ein Thema von Marco Steinebach · begonnen am 17. Jun 2009 · letzter Beitrag vom 14. Aug 2009
 
Marco Steinebach

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

Re: Stille aus Wave-Dateien entfernen?

  Alt 20. Jun 2009, 01: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
 


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 05:33 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