1

これが私のコードです。それらのいくつかを iOS ライブラリからコピーしました。

- (void)getSamplesWithFileName:(NSString *)fileName
                storeToPointer:(SInt16*)pointer
           withNumberOfSamples:(UInt32*)numberOfSamples
{
    NSFileManager* fileManager = [NSFileManager defaultManager];
    NSURL* url = [[fileManager URLsForDirectory:NSCachesDirectory inDomains:NSUserDomainMask] lastObject];
    NSLog(@"%@",url);
    NSString* directory = [url path];
    NSString* nsFilePath = [directory stringByAppendingPathComponent:fileName];
    const char* filePath = [nsFilePath cStringUsingEncoding:[NSString defaultCStringEncoding]];
    CFURLRef audioFileURL =
    CFURLCreateFromFileSystemRepresentation (           // 1
                                             NULL,                                           // 2
                                             (const UInt8 *) filePath,                       // 3
                                             strlen (filePath),                              // 4
                                             false                                           // 5
                                             );
    struct AQPlayerState aqData;                                   // 1
    aqData.mDataFormat.mFormatID         = kAudioFormatLinearPCM; // 2
    aqData.mDataFormat.mSampleRate       = 8000.0;               // 3
    aqData.mDataFormat.mChannelsPerFrame = 1;                     // 4
    aqData.mDataFormat.mBitsPerChannel   = 16;                    // 5
    aqData.mDataFormat.mBytesPerPacket   =                        // 6
    aqData.mDataFormat.mBytesPerFrame =
    aqData.mDataFormat.mChannelsPerFrame * sizeof (SInt16);
    aqData.mDataFormat.mFramesPerPacket  = 1;                     // 7

    OSStatus result =
    AudioFileOpenURL (                                  // 2
                      audioFileURL,                                   // 3
                      kAudioFileReadPermission,//fsRdPerm                                       // 4
                      0,                                              // 5
                      &aqData.mAudioFile                              // 6
                      );
    NSLog(@"Play back open status:%ld", result);
    CFRelease (audioFileURL);                               // 7
    UInt32 dataFormatSize = sizeof (aqData.mDataFormat);    // 1
    AudioFileGetProperty (                                  // 2
                          aqData.mAudioFile,                                  // 3
                          kAudioFilePropertyDataFormat,                       // 4
                          &dataFormatSize,                                    // 5
                          &aqData.mDataFormat                                 // 6
                          );
    UInt32 numBytesReadFromFile;
    UInt32 numPackets = 100000;
//    pointer = malloc(numPackets * sizeof(SInt16));
    AudioFileReadPackets(aqData.mAudioFile, false, &numBytesReadFromFile, NULL, 0, &numPackets, pointer);
    printf("%ld", numBytesReadFromFile);
    *numberOfSamples = numBytesReadFromFile;    
}

しかし、間違ったデータを取得しているようです!「ああ」という声をテストしたところ、非常に高いゼロクロス率が得られました。この音声ファイルを正確に読み取るにはどうすればよいですか?

4

1 に答える 1

2

拡張オーディオファイルサービスを使用する

ExtAudioFileOpenURLでファイルを開き、ExtAudioFileReadでバッファに読み込みます。CoreAudioがサポートするすべてのフォーマットで動作します。

Core Audioプログラミングを学びたい場合は、 『Learning Core Audio:A Hands-On Guide to Audio Programming for Mac and iOS』をお勧めします。

編集:最初のリンクのドキュメントには、おそらく役立つサンプルコードが含まれています。

于 2012-06-03T16:34:50.687 に答える