Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi lame_enc.dll 24 Bit wave -> mp3 (https://www.delphipraxis.net/161180-lame_enc-dll-24-bit-wave-mp3.html)

rapante 21. Jun 2011 10:59

lame_enc.dll 24 Bit wave -> mp3
 
Hallo zusammen,

ich nutze die lame_enc.dll (über TLameCoder) um mp3's zu encodieren. Mit 16 bit Wave-Files funktioniert das auch underbar - bei 24 Bit Files
enthalten die erzeugten mp3-Files nur rauschen.

Alle Programme/Beispiele(newac/wav2mp3encoder...) die ich im Netz gefunden habe und auf die lame_enc.dll aufbauen haben das selbe Problem. Einzige Ausnahme ist
Audacity - dort funktioniert es mit der dll.

Es muss also irgendwie möglich sein ;)

Hat jemand eine Idee wie man die dll ansprechen muss, damit die 24 bit Files korekt verarbeitet werden?

Wishmaster 22. Jun 2011 23:13

AW: lame_enc.dll 24 Bit wave -> mp3
 
Hi
soweit ich mich erinnere erlaubt die lame_enc.dll nur 16 Bit
ich kann dir weiterhelfen wen du die bass.dll nutzt!


mit der bass.dll, ich lade alle Dateien/Audio Formate als 32-bit floating-point für die beste Qualität
danach konvertiere ich die Daten nach 8/16/24/32 Bit (kommt auf den encoder an libFlac.dll, lame_enc.dll,....)
Delphi-Quellcode:

(************ Convert 32 Bit Floating-point to 16 Bit integer LE/BE ************)

function Clip_16(Value: Integer): SmallInt;
asm
        cmp      eax, 32767
        jle      @@Lower
        mov      ax, 32767
        ret
@@Lower:
        cmp      eax, -32768
        jge      @@Finished
        mov      ax, -32768
@@Finished:
end;

procedure DSP32f_16bitLE(handle: HDSP; channel: DWORD; buffer: Pointer; length: DWORD; user: Pointer); stdcall;
var
  src : array of Single;
  dst : array of SmallInt;
  i : Integer;
  SaveValue : Integer;
begin
   SetLength(src, length);
   SetLength(dst, length div 2);

   move(buffer^, src[0], length);

  for I := 0 to (length div 4) do
   begin
    // convert to integer
    SaveValue := Trunc(src[I] * 32768);
    // clip it
    SaveValue := Clip_16(SaveValue);
    // store it (native endian)
    dst[I] := SmallInt(SaveValue);
   end;




 //Encoder_Write(@dst[0], length div 2);
end;

// Bass.dll
BASS_ChannelSetDSP(Chan_Mixer, @DSP32f_16bitLE, Self, 1);

samso 23. Jun 2011 06:22

AW: lame_enc.dll 24 Bit wave -> mp3
 
Die 24 Bit Auflösung bringt sowieso nichts, weil das Rauschen eines MP3-Datenstroms so optimiert wird, das es knapp unter der Hörschwelle liegt. Du kannst die 24-Bit-Werte einfach durch 256 teilen (x := x shr 8), also die unteren 8 Bits schlicht ignorieren, um auf die 16-Bit-Audiosamples zu kommen. (Letztendlich macht das trunc() im Beispielcode nichts anderes - nämlich die unteren 8 Bits wegwerfen)
Falls es auf optimale Audioqualität ankommt, muss die Audiodatei zunächst auf Vollpegel normalisiert werden, dann auf 16 Bit runter gerechnet werden und erst danach in den MP3-Encoder geschickt werden.

rapante 23. Jun 2011 07:48

AW: lame_enc.dll 24 Bit wave -> mp3
 
Hi,
Zitat:

Zitat von Wishmaster (Beitrag 1107830)
soweit ich mich erinnere erlaubt die lame_enc.dll nur 16 Bit

...das war die entscheidene Info die ich nicht gefunden/übersehen hatte.
Also zunächst die Waves auf 16 bit bringen und dann erst durch den lame jagen....

Kaum macht mans richtig - schon funktionierts :thumb:

Vielen Dank euch beiden


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:36 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