Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Brauche hilfe mit LibFlac / 8 BPS (https://www.delphipraxis.net/184325-brauche-hilfe-mit-libflac-8-bps.html)

Wishmaster 18. Mär 2015 07:44


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.

samso 18. Mär 2015 09:17

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?

Wishmaster 19. Mär 2015 06:39

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...

mikhal 19. Mär 2015 09:17

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

Wishmaster 19. Mär 2015 22:21

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.

Wishmaster 16. Apr 2015 01:15

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;

Wishmaster 17. Apr 2015 22:24

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 16:01 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz