1. Qu'est-ce que Lame ?
Lame est un encodeur de haute qualité pour le format audio MPEG Audio Layer III (MP3), distribué sous la licence LGPL, selon la description ofifcielle du site web de Lame (https://lame.sourceforge.io/index.php). En d'autres termes, Lame est un encodeur open-source spécialement conçu pour l'encodage des fichiers MP3.
2. Pourquoi utiliser Lame ?
Pour les développeurs Android qui ont travaillé sur des fonctionnalités d'enregistrement audio, il existe deux principales méthodes pour enregistrer de l'audio : AudioRecord et MediaRecorder. AudioRecord enregistre directement des données PCM brutes, tandis que MediaRecorder permet d'enregistrer des fichiers dans différents formats tels que AMR, AAC, etc. Cependant, MediaRecorder ne prend pas en charge l'enregistrement direct en format MP3. Voici les formats actuellement supportés par MediaRecorder :
public final class AudioEncoder {
private AudioEncoder() {}
public static final int DEFAULT = 0;
public static final int AMR_NB = 1; // Codec audio AMR (Narrowband)
public static final int AMR_WB = 2; // Codec audio AMR (Wideband)
public static final int AAC = 3; // Codec audio AAC Low Complexity (AAC-LC)
public static final int HE_AAC = 4; // Codec audio High Efficiency AAC (HE-AAC)
public static final int AAC_ELD = 5; // Codec audio Enhanced Low Delay AAC (AAC-ELD)
public static final int VORBIS = 6; // Codec audio Ogg Vorbis
public static final int EVRC = 10; // Codec audio EVRC
public static final int QCELP = 11; // Codec audio QCELP
public static final int LPCM = 12; // Codec audio Linear PCM
}
Comme on peut le voir, le format MP3 n'est pas pris en charge. C'est là que Lame entre en jeu, permettant l'encodage des fichiers MP3 à partir de données PCM.
3. Comment utiliser Lame dans une application Android
L'intégration de code open-source dans une application Android suit généralement un processus similaire : télécharger le code source, compiler les bibliothèques nécessaires (souvent des fichiers .so), et ensuite appeler les méthodes fournies par ces bibliothèques via JNI.
Après avoir compilé le code source de Lame, vous obtiendrez un fichier libmp3lame.so. Pour appeler les méthodes de cette biblitohèque, vous devrez implémenter une couche JNI. Le flux global consiste à appeler des méthodes natives via JNI, qui à leur tour appellent les méthodes de la biblitohèque libmp3lame.so.
Voici un exemple simple de conversion d'un fichier PCM en MP3 :
File pcmFile = new File(getExternalFilesDir(null), "input.pcm");
File mp3File = new File(getExternalFilesDir(null), "output.mp3");
LameEncodeJniNative lameEncoder = new LameEncodeJniNative();
lameEncoder.encode(pcmFile.getAbsolutePath(), mp3File.getAbsolutePath(), 44100, 2, 128);
Dans cet exemple, LameEncodeJniNative est une classe qui fournit des méthodes natives pour l'encodage. Les paramètres passés à la méthode encode incluent le chemin du fichier PCM, le chemin du fichier MP3, la fréquence d'échantillonnage, le nombre de canaux, et le débit binaire.