2010-02-09 19 views
4

Je suis développeur iphone et de développer une application mac maintenant. C'est mon premier projet sur Mac.Comment analyser le fichier BPM de AAC ou de toute bibliothèque pour convertir AAC en MP3

Je dois analyser le BPM des fichiers de chansons. J'ai fait ce travail pour MP3 en utilisant FMOD et la bibliothèque SoundTouch.

Mais je dois aussi analyser pour AAC (M4A) mais cette bibliothèque ne supporte pas le format AAC.

J'ai essayé de rechercher la bibliothèque pour AAC (M4A) et je n'ai rien obtenu pour cela. Donc, si nous pouvions convertir ce fichier AAC en fichier MP3 par programmation en cacao, nous pourrions analyser le bpm de ce fichier.

J'ai essayé de rechercher la conversion de l'AAC en Mp3 dans le cacao et j'ai obtenu la bibliothèque FAAC mais il n'y a aucune documentation pour l'intégration avec le cacao et sa trop complexe.

Quelqu'un connaît-il une autre bibliothèque pour analyser BPM pour AAC dans le projet de cacao.

Beaucoup de Merci.

Répondre

0

Comment utilisez-vous actuellement SoundTouch? Transmettez-vous des échantillons audio à la bibliothèque SoundTouch lorsque vous les lisez? Ou est-ce que vous lancez l'utilitaire soundstretch et transmettez l'audio sous forme de fichier ou de pipe?

Je ne suis pas familier avec SoundTouch, mais on dirait qu'il veut l'audio PCM comme entrée, donc vous êtes probablement déjà en train de convertir en PCM. Si vous voulez passer des échantillons audio à SoundTouch que vous les recevez, vous pouvez décoder avec FAAC en utilisant quelque chose comme ça

#include <stdio.h> 
#include <inttypes.h> 
#include <faac.h> 
#include <neaacdec.h> 

#define SAMPLE_SIZE 2 //2 bytes, or 16bits per samle. 

int AACDecode(uint8_t *aacData, size_t aacBytes, uint32_t sampleRate, unsigned char channels) 
{ 
    NeAACDecHandle decoder = NeAACDecOpen(); 
    NeAACDecConfigurationPtr config = NeAACDecGetCurrentConfiguration(decoder); 
    NeAACDecFrameInfo info; 
    uint8_t *decoded = NULL; 
    uint8_t *readPtr = aacData; 
    int consumed = 0; 

    //If the AAC data is wrapped in ADTS, you don't need the next 2 lines 
    //If it's not wrapped in ADTS, you need to know sampleRate, and object type 
    //Object type is one of LOW, MAIN, SSR, LTP 
    config->defObjectType = LOW; 
    config->defSampleRate = sampleRate; 
    //If SoundTouch wants it in something other than siged 16bit LE PCM, change this 
    config->outputFormat = FAAD_FMT_16BIT; 
    if (!NeAACDecSetConfiguration(decoder, config)) 
    { 
     printf("unable to set config\n"); 
     return 0; 
    } 

    if (NeAACDecInit(decoder, (unsigned char *)aacData, aacBytes, &sampleRate, &channels) < 0) 
    { 
     printf("unable to init\n"); 
     return 0; 
    } 

    do 
    { 
     decoded = (char *)NeAACDecDecode(decoder, &info, readPtr, aacBytes); 
     if (info.samples > 0) 
     { 
      size_t decodedBytes = (size_t)info.samples * SAMPLE_SIZE; 
      //Pass <decodedBytes> of PCM data, pointed to by <decoded> to soundTouch 
     } 

     consumed += info.bytesconsumed; 
     readPtr += info.bytesconsumed; 
    } while (info.error == 0 && consumed < aacBytes); 

    NeAACDecClose(decoder); 
    return 1; 
} 

Vous auriez besoin de se lier à la bibliothèque FAAD

Ou si vous êtes allant de la route de ligne de commande, peut-être quelque chose comme ceci:

ffmpeg -i <input_file> raw.wav 

raw.wav pourrait alors être transmis à soundstretch

+0

J'ai essayé votre code, mais il échoue à NeAACDecDecode (info.error n'est pas z ero), bien que l'utilitaire de ligne de commande faad décode correctement mon fichier. Des pensées? – lynnard