![]() |
Brauche hilfe mit LibFlac / 8 BPS
Liste der Anhänge anzeigen (Anzahl: 1)
Hi. ich brauche mal wieder eure hilfe :-)
ich versuche mit hilfe der bass.dll eine '.flac' date aufzuzeichnen. dazu benutze ich die LibFlac.dll es funktioniert auch ziemlich gut mit 16 und 24 BPS, doch mir macht das 8 BPS schaffen und ich finde das problem einfach nicht. 'the sound gets distorted' siehe anhang.
Delphi-Quellcode:
Channel:= BASS_StreamCreate_(.....);
(* Create Encoder Channel *) if not Assigned(FEncoderFlac) then FEncoderFlac:= TEncoderFLAC.Create; FEncoderFlac.Channels := Channels; // default 2 FEncoderFlac.Samplerate := Samplerate; // default 44100 FEncoderFlac.BitsPerSample := BitsPerSample; // default 16; FEncoderFlac.CompressionLevel := Compression; // default 6 FEncoderFlac.Filename := FFilename; // file.flac Res:= FEncoderFLAC.Encoder_Prepare(Channel, false); // if (Res > 1) then begin //Error Exit; end; BASS_ChannelPlay(Channel, true); Thx. |
AW: Brauche hilfe mit LibFlac / 8 BPS
Naja, 8 BitsProSample ist ja nicht mal Telefonqulität (beim Telefon wird mit einer nicht-linearen Quantisierung gearbeitet). Vermutlich ist das bei FLAC nicht vorgesehen. Brauchst Du das wirklich?
|
AW: Brauche hilfe mit LibFlac / 8 BPS
erstmal danke fur die antwort!
ja, ich weis das 8 BPS nicht grade die beste qulität ist. und ich weis das die Libflac.dll die vormate [8, 16, 24] BPS unterstützt ab und zu brauche ich halt die 8 BPS! So wenn jemand den fehler sieht... |
AW: Brauche hilfe mit LibFlac / 8 BPS
Ich bin kein Fachmann auf diesem Gebiet: Steht BPS nicht für Bits per sample?
Grüße Mikhal |
AW: Brauche hilfe mit LibFlac / 8 BPS
Liste der Anhänge anzeigen (Anzahl: 1)
Ja! BPS Steht für Bits Per Sample.
so anhand der vielen ;-) antworten vermute ich mal dass keiner einen Plan vom thema hat. ich sehe gerade dass ich nicht alle nötigen komponenten beigefügt hatte thanks anyway. |
AW: Brauche hilfe mit LibFlac / 8 BPS
Liste der Anhänge anzeigen (Anzahl: 2)
hi
wollte mal nachfragen ob jemand sich das ganze angeschaut hat. ich habe mich damit etwas mehr beschäftigt und bin ein wenig weiter gekommen. zumindest spielt es die aufgezeichnete Date suber ab! das problem ist alerdings das es jetzt beim Stereo als auch beim Mono die daten nach rechts verschiebt (Rechter lautsprecher) siehe anhang
Delphi-Quellcode:
type
TBuffer8 = array[0..0] of Byte; PBuffer8 = ^TBuffer8; var FBuffer : PBuffer8; procedure TEncoderFLAC.FeederThreadWorkerCallback(Thread: TMultiThreadThread; Parameters: TObject; var Data: TObject; var Results: TObject); var //Buffer : PSmallInt; //Buffer : PBuffer8; i, samples : LongWord; FB : PFLACBuf; FBU : PFLACUBuf; B8 : PBuffer8; B16 : PBuffer16; B32 : PBuffer32; Length : DWORD; WorkMessage: TWorkMessage; WorkResult : TWorkResult; Timer : TWaitResult; begin WorkMessage := TWorkMessage.Create; WorkMessage.ID := TWork(Data).ID; WorkMessage.Text := 'Starting.'; WorkMessage.Status:= thStarting; Thread.SendMessage(WorkMessage); BitrateConverter.BitRate:= br8BitInteger; repeat Timer:= TWork(Data).TimeEvent.WaitFor(TWork(Data).TimeToWait); if Timer = wrTimeout then begin Length:= Bass_ChannelGetData(Channel_Source, FBuffer, FBlockSize * (FBitsPerSample shr 3) * FChannels); if Length = DW_ERROR then exit; Length:= BitrateConverter.Process(FBuffer, Length, 32, true); if (FBuffer <> nil) and (Length <> 0) then begin Samples := (Length shl 3) div FBitsPerSample; GetMem(FB, Samples * SizeOF(FLAC__int32)); if FBitsPerSample = 8 then <<---------------------------------------------- begin if FChannels = 1 then // Mono begin for i := 0 to Samples - 1 do FB[i] := FBuffer[i] shr 1; end else if FChannels = 2 then // Stereo begin for i := 0 to Samples - 1 do FB[i] := FBuffer[i] div 2; end; end else if FBitsPerSample = 16 then begin B16 := @FBuffer[0]; for i := 0 to Samples - 1 do FB[i] := B16[i]; end else if FBitsPerSample = 24 then begin FBU := PFLACUBuf(FB); for i := 0 to Samples - 1 do FBU[i] := (ShortInt(FBuffer[i * 3 + 2]) shl 16) + (FBuffer[i * 3 + 1] shl 8) + (FBuffer[i * 3]); end else if FBitsPerSample = 32 then begin B32 := @FBuffer[0]; for i := 0 to Samples - 1 do FB[i] := B32[i]; end; if not FLAC__stream_encoder_process_interleaved(_encoder, @FB[0], Samples div FChannels) then raise Exception.Create('Failed to encode data.'); FreeMem(FB); end; end; until (Timer <> wrTimeout) or (Thread.Terminated); //* If the thread is terminated in the mean time we can be notifyied if Thread.Terminated then begin WorkMessage := TWorkMessage.Create; WorkMessage.ID := TWork(Data).ID; if Assigned(TWork(Data).TimeEvent) then // test TWork(Data).TimeEvent.SetEvent; TWork(Data).TimeEvent.Free; WorkMessage.Text := 'Terminated.'; WorkMessage.Status:= thTerminated; Thread.SendMessage(WorkMessage); Exit; end; WorkResult := TWorkResult.Create; WorkResult.ID := TWork(Data).ID; if Assigned(TWork(Data).TimeEvent) then TWork(Data).TimeEvent.SetEvent; TWork(Data).TimeEvent.Free; WorkResult.Text := 'Finished Successfuly.'; WorkResult.Status:= thFinished; Results := WorkResult; end; |
AW: Brauche hilfe mit LibFlac / 8 BPS
ok, falls es jemanden interessiert ich habe die lösung für mein kleines problem!
Delphi-Quellcode:
if FBitsPerSample = 8 then
begin for i := 0 to samples - 1 do FB[i] := FBuffer[i] xor 128; end else if FBitsPerSample = 16 then ........ |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:39 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-2025 by Thomas Breitkreuz