2009-06-02 11 views
14

Je travaille sur une application qui doit traiter des fichiers audio. Lorsque j'utilise des fichiers mp3, je ne sais pas comment gérer les données (les données qui m'intéressent sont les octets audio, ceux qui représentent ce que nous entendons).Comment obtenir des données audio à partir d'un MP3?

Si j'utilise un fichier wav, je sais que j'ai un en-tête de 44 octets, puis les données. Quand il s'agit d'un mp3, j'ai lu qu'ils sont composés de cadres, chaque image contenant un en-tête et des données audio. Est-il possible d'obtenir toutes les données audio à partir d'un fichier mp3? J'utilise Java (j'ai ajouté MP3SPI, Jlayer et Tritonus) et je suis capable d'obtenir les octets du fichier, mais je ne suis pas sûr de ce que ces octets représentent ou comment gérer alors .

Répondre

26

De l'documentation for MP3SPI:

File file = new File(filename); 
AudioInputStream in= AudioSystem.getAudioInputStream(file); 
AudioInputStream din = null; 
AudioFormat baseFormat = in.getFormat(); 
AudioFormat decodedFormat = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, 
              baseFormat.getSampleRate(), 
              16, 
              baseFormat.getChannels(), 
              baseFormat.getChannels() * 2, 
              baseFormat.getSampleRate(), 
              false); 
din = AudioSystem.getAudioInputStream(decodedFormat, in); 

Vous pouvez ensuite lire uniquement les données de din - ce sont les données "brutes" comme par decodedFormat. (Voir la docs for AudioFormat pour plus d'informations.)

(Notez que ce code ne se ferme pas le flux ou quelque chose comme ça -. Utiliser try/finally blocs appropriés comme normal)

+0

Salut Jon, Merci pour votre réponse rapide! Dans votre proposition; est 'decodedFormat' une représentation des données mp3 décodées dans un autre format? si j'écris "din.read()", est-ce que j'obtiens les octets de données au format décodé? Merci – dedalo

+0

Oui. DecodedFormat dit "Je veux que vous décodiez en tant que données PCM signées". –

+0

Salut. J'ai suivi votre conseil et cela a fonctionné. Pour visualiser les données que j'utilise: while ((numBytesRead = din.read (audioBytes))! = -1) {} Ceci lit les octets dans 'din' et les stocke dans le tableau audioBytes. J'ai essayé de visualiser les données en utilisant: while ((numBytesRead = din.read (audioBytes))! = -1) { System.out.println ("Octets décodés" + audioBytes [0]);} J'ai une question à propos de ces données: Chaque échantillon utilise 16 bits, soit 2 positions dans le tableau audioBytes, rigth? Comment pourrais-je obtenir la valeur de chaque échantillon? Est-ce que le format décodé (wav) a les 44 octets d'en-tête? Merci beaucoup pour votre aide! – dedalo

0

Les données que vous voulez sont les échantillons réels, tandis que MP3 représente les données différemment. Donc, comme tout le monde l'a dit - vous avez besoin d'une bibliothèque pour décoder les données MP3 en échantillons réels pour votre usage.

0

Comme mentionné dans les autres réponses, vous avez besoin d'un décodeur pour décoder le MP3 en échantillons audio réguliers. Une option populaire serait JavaLayer (LGPL).

Questions connexes