WAV -> MP3 : Utiliser LAME Encoder (lame_enc.dll) avec Delphi
emmanuelgo
Messages postés58Date d'inscriptionvendredi 24 décembre 2004StatutMembreDernière intervention13 avril 2005
-
15 févr. 2005 à 22:27
Filipe35
Messages postés470Date d'inscriptionvendredi 14 novembre 2003StatutMembreDernière intervention23 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...
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_
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;
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
emmanuelgo
Messages postés58Date d'inscriptionvendredi 24 décembre 2004StatutMembreDernière intervention13 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...
emmanuelgo
Messages postés58Date d'inscriptionvendredi 24 décembre 2004StatutMembreDernière intervention13 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 !!!!
Filipe35
Messages postés470Date d'inscriptionvendredi 14 novembre 2003StatutMembreDernière intervention23 octobre 20071 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...
emmanuelgo
Messages postés58Date d'inscriptionvendredi 24 décembre 2004StatutMembreDernière intervention13 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 !