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;    
}

但似乎我得到了错误的数据!我测试了声音'Ahhhhhh',并获得了非常高的过零率。我怎样才能阅读这个音频文件?

4

1 回答 1

2

使用扩展音频文件服务

使用 ExtAudioFileOpenURL 打开文件,使用 ExtAudioFileRead 将它们读入缓冲区。适用于 Core Audio 支持的所有格式。

如果您想学习 Core Audio 编程,我可以推荐这本书Learning Core Audio: A Hands-On Guide to Audio Programming for Mac 和 iOS 。

编辑:第一个链接中的文档有示例代码,可能会对您有所帮助。

于 2012-06-03T16:34:50.687 回答