4

私は iphone 開発者で、現在 1 つの Mac アプリケーションを開発しています。これは、Mac プラットフォームでの初めてのプロジェクトです。

曲ファイルの BPM を分析する必要があります。FMOD と SoundTouch ライブラリを使用して、MP3 でこの作業を行いました。

ただし、AAC (M4A) も分析する必要がありますが、このライブラリは AAC 形式をサポートしていません。

AAC(M4A) のライブラリを検索しようとしましたが、何も得られませんでした。したがって、ココアでプログラムを使用してこの AAC ファイルを MP3 ファイルに変換できれば、そのファイルの bpm を分析できます。

ココアでAACをMp3に変換する方法を検索しようとしましたが、FAACライブラリを入手しましたが、ココアと統合するためのドキュメントがなく、複雑すぎます。

ココアプロジェクトでAACのBPMを分析するための他のライブラリについて知っている人はいますか?

大変感謝します。

4

1 に答える 1

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 に渡すことができます

于 2010-03-18T14:06:00.897 に答える