AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Brauche hilfe mit LibFlac / 8 BPS

Brauche hilfe mit LibFlac / 8 BPS

Ein Thema von Wishmaster · begonnen am 18. Mär 2015 · letzter Beitrag vom 17. Apr 2015
Antwort Antwort
Wishmaster

Registriert seit: 14. Sep 2002
Ort: Steinbach, MB, Canada
301 Beiträge
 
Delphi XE2 Architect
 
#1

Brauche hilfe mit LibFlac / 8 BPS

  Alt 18. Mär 2015, 08:44
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.
Angehängte Dateien
Dateityp: rar Flac.rar (242,6 KB, 4x aufgerufen)

Geändert von Wishmaster (19. Mär 2015 um 07:40 Uhr)
  Mit Zitat antworten Zitat
samso

Registriert seit: 29. Mär 2009
439 Beiträge
 
#2

AW: Brauche hilfe mit LibFlac / 8 BPS

  Alt 18. Mär 2015, 10:17
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?
  Mit Zitat antworten Zitat
Wishmaster

Registriert seit: 14. Sep 2002
Ort: Steinbach, MB, Canada
301 Beiträge
 
Delphi XE2 Architect
 
#3

AW: Brauche hilfe mit LibFlac / 8 BPS

  Alt 19. Mär 2015, 07:39
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...
  Mit Zitat antworten Zitat
Benutzerbild von mikhal
mikhal

Registriert seit: 11. Sep 2003
Ort: Linz am Rhein
795 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Brauche hilfe mit LibFlac / 8 BPS

  Alt 19. Mär 2015, 10:17
Ich bin kein Fachmann auf diesem Gebiet: Steht BPS nicht für Bits per sample?

Grüße
Mikhal
Michael Kraemer
Computer erleichtern die Arbeit...
...und die Erde ist eine Scheibe!
  Mit Zitat antworten Zitat
Wishmaster

Registriert seit: 14. Sep 2002
Ort: Steinbach, MB, Canada
301 Beiträge
 
Delphi XE2 Architect
 
#5

AW: Brauche hilfe mit LibFlac / 8 BPS

  Alt 19. Mär 2015, 23:21
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.
Angehängte Dateien
Dateityp: rar Flac.rar (244,8 KB, 3x aufgerufen)
  Mit Zitat antworten Zitat
Wishmaster

Registriert seit: 14. Sep 2002
Ort: Steinbach, MB, Canada
301 Beiträge
 
Delphi XE2 Architect
 
#6

AW: Brauche hilfe mit LibFlac / 8 BPS

  Alt 16. Apr 2015, 02:15
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;
Miniaturansicht angehängter Grafiken
flac_8bit_stereo.jpg   flac_8bit_mono.jpg  
  Mit Zitat antworten Zitat
Wishmaster

Registriert seit: 14. Sep 2002
Ort: Steinbach, MB, Canada
301 Beiträge
 
Delphi XE2 Architect
 
#7

AW: Brauche hilfe mit LibFlac / 8 BPS

  Alt 17. Apr 2015, 23:24
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
 ........
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 13:02 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