aac - 如何分析 AAC 文件或任何用于将 AAC 转换为 MP3 的库的 BPM

标签 aac audio-processing

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

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

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

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

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

有谁知道 cocoa 项目中用于分析 AAC 的 BPM 的任何其他库。

非常感谢。

最佳答案

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

关于aac - 如何分析 AAC 文件或任何用于将 AAC 转换为 MP3 的库的 BPM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2228716/

相关文章:

LabVIEW中的音频处理(可以进行流处理吗??)

c++ - 改变音频的节奏(速度)

c++ - 16 字节对齐 AAC 编码数据

ffmpeg - ffmpeg中来自一个来源的多个音轨

python - 从在线流中记录的损坏的 AAC 文件

linux - 用于在 linux shell 上将 wav 编码为 aac 的库?

android - 如何在 Android 中更改 .wav 文件的音调?

python - 使用 Mutagen 处理所有接受的文件类型