【问题标题】:How to analyze the BPM of AAC file or any library for converting AAC to MP3如何分析 AAC 文件或任何库的 BPM 以将 AAC 转换为 MP3
【发布时间】:2011-01-14 18:47:39
【问题描述】:

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

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

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

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

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

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

非常感谢。

【问题讨论】:

    标签: aac audio-processing


    【解决方案1】:

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

    【讨论】:

    • 我尝试了您的代码,但在 NeAACDecDecode 失败(info.error 不为零),尽管 faad 命令行实用程序正确解码了我的文件。有什么想法吗?
    猜你喜欢
    • 2019-02-05
    • 2012-05-30
    • 2019-03-15
    • 2010-09-09
    • 1970-01-01
    • 2013-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多