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