如何分析AAC文件或任何库的BPM以将AAC转换为MP3

时间:2010-02-09 11:42:06

标签: aac audio-processing

我是iphone开发人员,现在开发一个mac应用程序。这是我在mac平台上的第一个项目。

我必须分析歌曲文件的BPM。我使用FMOD和SoundTouch库为MP3完成了这项工作。

但我必须分析AAC(M4A),但这个库不支持AAC格式。

我试图在库中搜索AAC(M4A),但我没有得到任何东西。所以我们如果可以通过编程在cocoa中将这个AAC文件转换为MP3文件,那么我们就可以分析该文件的bpm。

我试图在可可中搜索将AAC转换为Mp3并且我有FAAC库,但是没有任何与cocoa集成的文档,而且它太复杂了。

有没有人知道在cocoa项目中为AAC分析BPM的任何其他库。

非常感谢。

1 个答案:

答案 0 :(得分:0)

您目前如何使用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