Как проанализировать BPM файла AAC или любой библиотеки для преобразования AAC в MP3 - PullRequest
4 голосов
/ 09 февраля 2010

Я разработчик iphone и сейчас разрабатываю одно приложение для Mac.Это мой первый проект на платформе Mac.

Мне нужно проанализировать BPM файлов песен.Я проделал эту работу для MP3, используя FMOD и библиотеку SoundTouch.

Но я также должен проанализировать AAC (M4A), но эта библиотека не поддерживает формат AAC.

Я пыталсяпоиск библиотеки для AAC (M4A), и я ничего не получил для этого.Таким образом, если бы мы могли преобразовать этот файл AAC в файл MP3 программно в какао, то мы могли бы проанализировать удары в минуту этого файла.

Я попытался найти преобразование AAC в Mp3 в какао, и я получил библиотеку FAAC, но естьнет никакой документации по интеграции с какао и его слишком сложным.

Кто-нибудь знает о какой-либо другой библиотеке для анализа BPM для AAC в проекте какао.

Большое, большое спасибо.

1 Ответ

0 голосов
/ 18 марта 2010

Как вы в настоящее время используете SoundTouch? Вы передаете аудиосэмплы в библиотеку SoundTouch во время их чтения? Или вы запускаете утилиту soundstretch и передаете аудио как файл или через канал?

Я не знаком со SoundTouch, но похоже, что в качестве входного сигнала требуется звук PCM, так что вы, вероятно, уже конвертируете в PCM. Если вы хотите передавать образцы звука в SoundTouch по мере их получения, вы можете декодировать их с помощью FAAC, используя что-то вроде этого

#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;
}

Вам нужно создать ссылку на библиотеку FAAD

Или, если вы идете по маршруту командной строки, может быть что-то вроде этого:

ffmpeg -i <input_file> raw.wav

raw.wav затем может быть передан в soundstretch

...