0

私の質問は、iOSサンドボックスにオーディオファイルを含めるように事前構成して、ビルド後すぐにオーディオキュー構造をテストできるようにする方法だと思います。

サーバーでホストしているストリームからオーディオを再生するiOSアプリに取り組んでいます。HTTPストリームからデータを取得する方法に取り組む前に、AudioQueueServicesを使用して電話からファイルを再生することから始めようと思いました。一度に複数のオーディオストリームを再生したい場合は、AVPlayerやその他のサービスではなく、オーディオキューを使用する必要があることを理解しています。

私が抱えている問題は、ファイルが見つからないためにCFURLRefを構成できないことです。

AudioBufferPlayer *player = (AudioBufferPlayer*) inUserData;

if (player.playing) {

    NSString *path = @"/Users/acopp/Library/Application Support/iPhone Simulator/5.1/Applications/F9CA1197-A661-4B2F-9B42-68A991F61B19/";
    const char *filePath = [path cStringUsingEncoding:[NSString defaultCStringEncoding]];
    CFURLRef audioFileURL = CFURLCreateFromFileSystemRepresentation(NULL, (const UInt8*)filePath, strlen(filePath), false);

    OSStatus result = AudioFileOpenURL(audioFileURL, kAudioFileReadPermission, kAudioFileCAFType, player.mAudioFile); 

    UInt32 numBytesReadFromFile;
    UInt32 numPackets = player.mNumPacketsToRead;

    AudioFileReadPackets(
                         *(player.mAudioFile),
                         false,
                         &numBytesReadFromFile,
                         NULL,
                         player.mCurrentPacket,
                         &numPackets,
                         inBuffer->mAudioData
                         );

    if (numPackets > 0) {
        inBuffer->mAudioDataByteSize = numBytesReadFromFile;
        AudioQueueEnqueueBuffer(inAudioQueue, inBuffer, 0, NULL);
        player.mCurrentPacket += numPackets;
    }

AudioFileReadPacketsでEXC_BAD_ACCESSというエラーが表示され、この時点でOSStatusの結果が-50に設定されているため、AudioFileOpenURL呼び出しが失敗していると思います。

私の問題は、この時点で*パスが実際には何も指していないことだと思います。問題は私が行くときです

@"/Users/acopp/Library/Application Support/iPhone Simulator/5.1/Applications/F9CA1197-A661-4B2F-9B42-68A991F61B19/"

私の4つのオプションは、Demo3、Documents、Library、およびtempです。これらのどれにも、プロジェクトに追加したquick.cafファイルがありません。

TL、DR-何かを見落とさない限り、iPhoneシミュレーターでコードをテストできるように、ビルドする前にサンドボックスにオーディオファイルを追加する方法を尋ねていると思います。

4

2 に答える 2

0

プロジェクトに追加するファイルは、ドキュメントやライブラリ/キャッシュではなく、アプリのバンドルディレクトリに配置されます。シミュレーターの場合、このアプリバンドルは通常、シミュレーターアプリケーションサポートエリアではなく、XcodeBuildまたはDerivedDataディレクトリ内にあります。

適切なパスを取得する簡単な方法の1つは、アプリの最初の実行時に、アプリのサンドボックスDocumentsまたはLibrary/Cachesディレクトリに一意の名前で小さなダミーファイルを作成することです。アプリを終了し、このファイル作成コードを削除してから、MacでSpotlightを使用してダミーファイルを見つけます。好きなものと交換してください。次に、同じパスからコードを読み取り、ダミーファイルを作成してアプリを実行します。

于 2012-07-17T18:44:17.287 に答える
0

使用できます:

    NSString *bundlePath = [[NSBundle mainBundle] bundlePath];

プロジェクトに含まれているファイルにアクセスします。

于 2012-07-18T12:50:07.080 に答える