WAV -> MP3 : Utiliser LAME Encoder (lame_enc.dll) avec Delphi

emmanuelgo Messages postés 58 Date d'inscription vendredi 24 décembre 2004 Statut Membre Dernière intervention 13 avril 2005 - 15 févr. 2005 à 22:27
Filipe35 Messages postés 470 Date d'inscription vendredi 14 novembre 2003 Statut Membre Dernière intervention 23 octobre 2007 - 23 févr. 2005 à 00:20
salut a tous
j'ai réaliser une appli qui enregistre les sons joués par la carte son (enfin pas tout a fait fini) et je souhaiterais pouvoir obtenir à la fin un fichier MP3...
pour cela j'aimerais utiliser LAME Encoder ( c'est à dire lame_enc.dll )..mais je n'ai absoluement aucune idée de comment faire....
apparemment dans les fichiers sources de lame encoder (que l'on trouve ici : http://lame.sourceforge.net/download/download.html ) il y a bien un fichier .pas, mais je ne comprends absoluement rien au code...quelqu'un peut - il m'aider.....
ou y'a t-il dautres methodes pour passer d'un wav à un mp3 ??
(j'ai vu qu'il ya des composants gratuits (je crois) mais j'aimerais essayer de me debrouiller par moi-même avant d'essayer un composant...

voici le code trouvé dans le fichier .pas du code source de lame encoder (étrangement les erreurs sont en francais) :
(c'est un peu long désolé)
(récupéré sur un forum : http://www.experts-exchange.com/Programming/Programming_Languages/Delphi/Q_21110791.html )

unit MP3export;

interface

uses SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
Forms, Dialogs, StdCtrls;

type
//type definitions
//typedef unsigned long HBE_STREAM;
//typedef HBE_STREAM *PHBE_STREAM;
//typedef unsigned long BE_ERR;
THBE_STREAM = LongWord;
PHBE_STREAM = ^PHBE_STREAM;
BE_ERR = LongWord;

const
// encoding formats
//#define BE_CONFIG_MP3 0
//#define BE_CONFIG_LAME 256
BE_CONFIG_MP3 = 0;
BE_CONFIG_LAME = 256;

// error codes
//#define BE_ERR_SUCCESSFUL 0x00000000
//#define BE_ERR_INVALID_FORMAT 0x00000001
//#define BE_ERR_INVALID_FORMAT_PARAMETERS 0x00000002
//#define BE_ERR_NO_MORE_HANDLES 0x00000003
//#define BE_ERR_INVALID_HANDLE 0x00000004
BE_ERR_SUCCESSFUL: LongWord = 0;
BE_ERR_INVALID_FORMAT: LongWord = 1;
BE_ERR_INVALID_FORMAT_PARAMETERS: LongWord = 2;
BE_ERR_NO_MORE_HANDLES: LongWord = 3;
BE_ERR_INVALID_HANDLE: LongWord = 4;

// other constants

BE_MAX_HOMEPAGE = 256;

// format specific variables

BE_MP3_MODE_STEREO = 0;
BE_MP3_MODE_DUALCHANNEL = 2;
BE_MP3_MODE_MONO = 3;

type

TMP3 = packed record
dwSampleRate: LongWord;
byMode: Byte;
wBitRate: Word;
bPrivate: LongWord;
bCRC: LongWord;
bCopyright: LongWord;
bOriginal: LongWord;
end;

TLHV1 = packed record
// STRUCTURE INFORMATION
dwStructVersion: DWORD;
dwStructSize: DWORD;

// BASIC ENCODER SETTINGS
dwSampleRate: DWORD; // ALLOWED SAMPLERATE VALUES DEPENDS ON dwMPEGVersion
dwReSampleRate: DWORD; // DOWNSAMPLERATE, 0=ENCODER DECIDES
nMode: Integer; // BE_MP3_MODE_STEREO, BE_MP3_MODE_DUALCHANNEL, BE_MP3_MODE_MONO
dwBitrate: DWORD; // CBR bitrate, VBR min bitrate
dwMaxBitrate: DWORD; // CBR ignored, VBR Max bitrate
nQuality: Integer; // Quality setting (NORMAL,HIGH,LOW,VOICE)
dwMpegVersion: DWORD; // MPEG-1 OR MPEG-2
dwPsyModel: DWORD; // FUTURE USE, SET TO 0
dwEmphasis: DWORD; // FUTURE USE, SET TO 0

// BIT STREAM SETTINGS
bPrivate: LONGBOOL; // Set Private Bit (TRUE/FALSE)
bCRC: LONGBOOL; // Insert CRC (TRUE/FALSE)
bCopyright: LONGBOOL; // Set Copyright Bit (TRUE/FALSE)
bOriginal: LONGBOOL; // Set Original Bit (TRUE/FALSE_

// VBR STUFF
bWriteVBRHeader: LONGBOOL; // WRITE XING VBR HEADER (TRUE/FALSE)
bEnableVBR: LONGBOOL; // USE VBR ENCODING (TRUE/FALSE)
nVBRQuality: Integer; // VBR QUALITY 0..9

btReserved: array[ 0..255 ] of Byte; // FUTURE USE, SET TO 0
end;

TAAC = packed record
dwSampleRate: LongWord;
byMode: Byte;
wBitRate: Word;
byEncodingMethod: Byte;
end;

TFormat = packed record
case byte of
1: ( mp3: TMP3 );
2: ( lhv1: TLHV1 );
3: ( aac: TAAC );
end;

TBE_Config = packed record
dwConfig: LongWord;
format: TFormat;
end;

PBE_Config = ^TBE_Config;

//typedef struct {
// // BladeEnc DLL Version number
//
// BYTE byDLLMajorVersion;
// BYTE byDLLMinorVersion;
//
// // BladeEnc Engine Version Number
//
// BYTE byMajorVersion;
// BYTE byMinorVersion;
//
// // DLL Release date
//
// BYTE byDay;
// BYTE byMonth;
// WORD wYear;
//
// // BladeEnc Homepage URL
//
// CHAR zHomepage[BE_MAX_HOMEPAGE + 1];
//
//} BE_VERSION, *PBE_VERSION;

TBE_Version = record
byDLLMajorVersion: Byte;
byDLLMinorVersion: Byte;

byMajorVersion: Byte;
byMinorVersion: Byte;

byDay: Byte;
byMonth: Byte;
wYear: Word;

zHomePage: array[ 0..BE_MAX_HOMEPAGE + 1 ] of Char;
end;

PBE_Version = ^TBE_Version;

//__declspec(dllexport) BE_ERR beInitStream(PBE_CONFIG pbeConfig, PDWORD dwSamples, PDWORD dwBufferSize, PHBE_STREAM phbeStream);
//__declspec(dllexport) BE_ERR beEncodeChunk(HBE_STREAM hbeStream, DWORD nSamples, PSHORT pSamples, PBYTE pOutput, PDWORD pdwOutput);
//__declspec(dllexport) BE_ERR beDeinitStream(HBE_STREAM hbeStream, PBYTE pOutput, PDWORD pdwOutput);
//__declspec(dllexport) BE_ERR beCloseStream(HBE_STREAM hbeStream);
//__declspec(dllexport) VOID beVersion(PBE_VERSION pbeVersion);

{
Function beInitStream(var pbeConfig: TBE_CONFIG; var dwSample: LongWord; var dwBufferSize: LongWord; var phbeStream: THBE_STREAM ): BE_Err; cdecl; external 'Bladeenc.dll';
//Function beEncodeChunk(hbeStream: THBE_STREAM; nSamples: LongWord; pSample: PSmallInt;pOutput: PByte; var pdwOutput: LongWord): BE_Err; cdecl; external 'Bladeenc.dll';
Function beEncodeChunk(hbeStream: THBE_STREAM; nSamples: LongWord; var pSample;var pOutput; var pdwOutput: LongWord): BE_Err; stdcall; cdecl 'Bladeenc.dll';
Function beDeinitStream(hbeStream: THBE_STREAM; var pOutput; var pdwOutput: LongWord): BE_Err; cdecl; external 'Bladeenc.dll';
Function beCloseStream(hbeStream: THBE_STREAM): BE_Err; cdecl; external 'Bladeenc.dll';
Procedure beVersion(var pbeVersion: TBE_VERSION); cdecl; external 'Bladeenc.dll';
}

function beInitStream( var pbeConfig: TBE_CONFIG; var dwSample: LongWord; var dwBufferSize: LongWord; var phbeStream: THBE_STREAM ): BE_Err; cdecl; external 'Lame_enc.dll';
//Function beEncodeChunk(hbeStream: THBE_STREAM; nSamples: LongWord; pSample: PSmallInt;pOutput: PByte; var pdwOutput: LongWord): BE_Err; cdecl; external 'Lame_enc.dll';
function beEncodeChunk( hbeStream: THBE_STREAM; nSamples: LongWord; var pSample; var pOutput; var pdwOutput: LongWord ): BE_Err; cdecl; external 'Lame_enc.dll';
function beDeinitStream( hbeStream: THBE_STREAM; var pOutput; var pdwOutput: LongWord ): BE_Err; cdecl; external 'Lame_enc.dll';
function beCloseStream( hbeStream: THBE_STREAM ): BE_Err; cdecl; external 'Lame_enc.dll';
procedure beVersion( var pbeVersion: TBE_VERSION ); cdecl; external 'Lame_enc.dll';

procedure EncodeWavToMP3( fs, fd: Integer );
implementation

uses InternetSnd, TraiteWav;

{----------------------------------------}

procedure EncodeWavToMP3( fs, fd: Integer );
var
err: Integer;
beConfig: TBE_Config;
dwSamples, dwSamplesMP3: LongWord;
hbeStream: THBE_STREAM;
error: BE_ERR;
pBuffer: PSmallInt;
pMP3Buffer: PByte;
Marque: PChar;

done: LongWord;
dwWrite: LongWord;
ToRead: LongWord;
ToWrite: LongWord;
i: Integer;

begin
beConfig.dwConfig := BE_CONFIG_LAME;

{
beConfig.Format.mp3.dwSampleRate := WavInfo.SamplesPerSec;
beConfig.Format.mp3.byMode := BE_MP3_MODE_STEREO;
beConfig.Format.mp3.wBitrate := strToInt(MainFrm.Mp3BitRate.Text);
beConfig.Format.mp3.bCopyright := 0;
beConfig.Format.mp3.bCRC := $00000000;
beConfig.Format.mp3.bOriginal := 0;
beConfig.Format.mp3.bPrivate := 0;
}
//Structure information
beConfig.Format.lhv1.dwStructVersion := 1;
beConfig.Format.lhv1.dwStructSize := SizeOf( beConfig );
//Basic encoder setting
beConfig.Format.lhv1.dwSampleRate := WavInfo.SamplesPerSec;
beConfig.Format.lhv1.dwReSampleRate := 44100;
beConfig.Format.lhv1.nMode := BE_MP3_MODE_STEREO;
beConfig.Format.lhv1.dwBitrate := strToInt( MainFrm.Mp3BitRate.Text );
beConfig.Format.lhv1.dwMaxBitrate := strToInt( MainFrm.Mp3BitRate.Text );
beConfig.Format.lhv1.nQuality := 2;
beConfig.Format.lhv1.dwMPegVersion := 1; //MPEG1
beConfig.Format.lhv1.dwPsyModel := 0;
beConfig.Format.lhv1.dwEmphasis := 0;
//Bit Stream Settings
beConfig.Format.lhv1.bPrivate := False;
beConfig.Format.lhv1.bCRC := False;
beConfig.Format.lhv1.bCopyright := True;
beConfig.Format.lhv1.bOriginal := True;
//VBR Stuff
beConfig.Format.lhv1.bWriteVBRHeader := false;
beConfig.Format.lhv1.bEnableVBR := false;
beConfig.Format.lhv1.nVBRQuality := 0;

i := 0;
error := beInitStream( beConfig, dwSamples, dwSamplesMP3, hbeStream );
if error = BE_ERR_SUCCESSFUL then begin
pBuffer := AllocMem( dwSamples * 2 );
pMP3Buffer := AllocMem( dwSamplesMP3 );
try
done := 0;

error := FileSeek( fs, 0, 0 );
while ( done < TotalSize ) do begin
if ( done + dwSamples * 2 < TotalSize ) then
ToRead := dwSamples * 2
else begin
ToRead := TotalSize - done;
//FillChar(buf[0],dwSamples*2,0);
FillChar( pbuffer^, dwSamples, 0 );
end;

//if FileRead(fs, buf[0], toread) = -1
if FileRead( fs, pbuffer^, toread ) = -1 then raise Exception.Create( 'Erreur de lecture' );

//error := beEncodeChunk(hbeStream, toRead div 2, Buf[0], TmpBuf[0], toWrite);
error := beEncodeChunk( hbeStream, toRead div 2, pBuffer^, pMP3Buffer^, toWrite );

if error <> BE_ERR_SUCCESSFUL then begin
beCloseStream( hbeStream );
raise Exception.Create( 'Echec de l''encodage' );
end;

//if FileWrite(fd, TmpBuf[0], toWrite) = -1
if FileWrite( fd, pMP3Buffer^, toWrite ) = -1 then raise Exception.Create( 'Erreur d''écriture' );

done := done + toread;
inc( i );
if i mod 64 = 0 then begin
MainFrm.ProgressBar1.Position := round( 100 * done / Totalsize );
Application.ProcessMessages;
end;
end;

error := beDeInitStream( hbeStream, pMP3Buffer^, dwWrite );
//error := beDeInitStream(hbeStream, TmpBuf[0], dwWrite);

if error <> BE_ERR_SUCCESSFUL then begin
beCloseStream( hbeStream );
raise Exception.Create( 'Echec à la sortie' );
end;

if dwWrite <> 0 then begin
//if FileWrite(fd, TmpBuf[0], dwWrite) = -1
if FileWrite( fd, pMP3Buffer^, dwWrite ) = -1 then raise Exception.Create( 'Erreur à la dernière écriture' );
end;

beCloseStream( hbeStream );
finally
FreeMem( pBuffer );
FreeMem( pMP3Buffer );
end;
end
else begin

end;
end;

end.

merci de votre aide

ps: j'ai delphi 6 personnel et WinXP pro et je débute plus ou moins

12 réponses

Filipe35 Messages postés 470 Date d'inscription vendredi 14 novembre 2003 Statut Membre Dernière intervention 23 octobre 2007 1
15 févr. 2005 à 23:48
salut,

ce ke tu peux faire c'est utiliser lame ou besweet en ligne de commande:

exemple:

Start(besweet -paramètres -fichierWAV); // lance le prog besweet ..etc...

c'est juste une idé

Filipe
0
emmanuelgo Messages postés 58 Date d'inscription vendredi 24 décembre 2004 Statut Membre Dernière intervention 13 avril 2005
16 févr. 2005 à 17:47
merci de ta reponse filipe,

cependant, cette solution (que j'avais egalement envisagée) ne me satisfait pas car cela implique d'utiliser un programme tierce (en l'occurence BeSweet), ce qui signifie que,alors, mon appli ne fonctionnerait pas "toute seule"...
c'est la raison pour laquelle je préférerai utiliser lame_enc.dll : c'est fait pour ca alors pourquoi s'en priver....
et puis j'ai le code, alors...le seul hic, c'est que j'ai un peu de mal à le déchiffrer...

personnelement, ce serait plus gratifiant pour moi de déchiffrer ce code (meme avec de l'aide) que d'utiliser un prog tout fait...

merci tout de même pour ta contribution !!
0
emmanuelgo Messages postés 58 Date d'inscription vendredi 24 décembre 2004 Statut Membre Dernière intervention 13 avril 2005
16 févr. 2005 à 18:21
pour etre totalement complet, on trouve lame_enc.dll v. 3.96.1 (la derniere) ici : http://mitiok.free.fr/lame-3.96.1.zip
0
Filipe35 Messages postés 470 Date d'inscription vendredi 14 novembre 2003 Statut Membre Dernière intervention 23 octobre 2007 1
17 févr. 2005 à 00:30
cela répondra p-e a tes attentes.

(je nai pas testé)

Filipe
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Filipe35 Messages postés 470 Date d'inscription vendredi 14 novembre 2003 Statut Membre Dernière intervention 23 octobre 2007 1
17 févr. 2005 à 00:31
den la foullé, g oublié le principal:

http://fdeport.free.fr/zip/mp3coder.zip
0
emmanuelgo Messages postés 58 Date d'inscription vendredi 24 décembre 2004 Statut Membre Dernière intervention 13 avril 2005
17 févr. 2005 à 20:16
merci à toi, merci de t'interesser à ma question....
je vais me pencher sur ce composant dés que j'aurais un peu de temps....ça devrait bien m'aider pour mon appli....
cependant oui, je suis chiant !), je cherche toujours à comprendre comment utiliser directement lame_enc.dll (ça n'a aucun coté pratique, le composant dont tu m'a donné l'adresse m'ira trés bien pour ce que j'ai à faire, mais j'aimerai juste comprendre comment utiliser cette DLL dans delphi sans passer par un composant mais par une procédue que j'aurais moi même écrite et comprise)

juste par curiosité, comment as tu trouvé ce composant ?? j'ai fait pas mal de recherche sur le net et pas grand chose...cela dit je ne cherchais pas particulierement un composant donc....

encore un grand merci à toi...mais ma question reste ouverte !!!!
0
Filipe35 Messages postés 470 Date d'inscription vendredi 14 novembre 2003 Statut Membre Dernière intervention 23 octobre 2007 1
18 févr. 2005 à 00:17
salut,

pour répondre à :

juste par curiosité, comment as tu trouvé ce composant ?? j'ai fait pas mal de recherche sur le net et pas grand chose

Simple: www.google.fr => lame_enc.dll+delphi
en page francophone => c'est la deuxième page.

certes disons que tu est chiant (c toi ki la dis) et que je suis tout a fait dacord avec toi sur ce ke tu veux faire: comprendre et pas "copier". mais SI cela n'est pas de ton nivo, essaye de terminer le programme pour en faire un complet puis revient la dessus plutart kan tes connaisssances oront "augmentées". (enfin c juste une suggestion).

Si tu cherche vraiment à "déchiffrer" le code que tu as mi en haut de la page, à ta place je chercherais ainsi:

-je sais ke je doi définir,
nom du fichier dentré
nom du fichier de sortie
bitrate(s)
constant ou variable
freq
etc...

donc je chercherais où se ballade ces variables.

(ex: ds procedure EncodeWavToMP3( fs, fd: Integer );

je chercherai ce ke signifie fs et fd............)

sur ceux

Bonne Prog

Filipe
0
Filipe35 Messages postés 470 Date d'inscription vendredi 14 novembre 2003 Statut Membre Dernière intervention 23 octobre 2007 1
18 févr. 2005 à 00:18
heu je réctifie:

Simple:
www.google.fr => lame_enc.dll+delphi
en page francophone => c'est la deuxième page.

c le premier lien maintenant !

Filipe
0
emmanuelgo Messages postés 58 Date d'inscription vendredi 24 décembre 2004 Statut Membre Dernière intervention 13 avril 2005
18 févr. 2005 à 17:20
encore merci pour tes réponses....



je n'avais même pas pris la peine de chercher dans les pages francophones...



merci pour tes conseils aussi, c'est comme cela que je comptais
procéder...il faut justye que je fasse appel à mes vieilles
connaissances en turbo pascal qui datent de la fac...ca devrait revenir
vite...mais je trouve ce code un peu bordélique, donc c'est ca qui est
le plus compliqué...

pour l'instant je continue à chercher sur le net, pour voir si je trouve pas un truc plus clair....

j'ai notamment trouvé un prog delphi sur sourceforge qui s'appelle
auvid et qui utilise lame_enc.dll ainsi que
besweet.dll...malheureusement, les codes ne semblent pas être
disponibles !!! aaaarrrggghhh...



par contre j'ai repéré 2 ou 3 appli en VB qui utilise lame_enc.dll
....je vais me pencher la dessus et essayer de transcrire en
delphi...ca devrait pas être bien sorcier....enfin je crois..

c'est quand même dommage de pas trouvé l'equivalent en delphi....



Et comme je le sens bien, je vais aussi me pencher sur l'utilisation de Besweet.dll en delphi ...éhéh....enfin peut être.....



encore merci pour tes réponses.....

si au hasard d'un surf tu trouves plus d'infos....n'hésite pas !
0
Filipe35 Messages postés 470 Date d'inscription vendredi 14 novembre 2003 Statut Membre Dernière intervention 23 octobre 2007 1
19 févr. 2005 à 23:29
pas de problèmes,

bonne prog et bon courage

prévient moi kan tu ora finit !

Filipe
0
emmanuelgo Messages postés 58 Date d'inscription vendredi 24 décembre 2004 Statut Membre Dernière intervention 13 avril 2005
22 févr. 2005 à 14:16
re



on trouve à cette adresse un code VB pour utiliser Lame_enc.dll : http://www.vbfrance.com/code.aspx?ID=4545

probleme: je ne connais pas VB, donc je ne sais pas quel fichier ouvrir pour trouver le code....
0
Filipe35 Messages postés 470 Date d'inscription vendredi 14 novembre 2003 Statut Membre Dernière intervention 23 octobre 2007 1
23 févr. 2005 à 00:20
salut,

si mes souvenirs sont bon:

bas => module (comme un composant, on y trouve du code)
frm => form (la tu trouve le code)
vbp => projet (aucune importance)

voila jespère ke je ne me suis pas tromper.

Filipe

Ps: ouvre les avec le Bloc-note
0
Rejoignez-nous