如何在 iOS 中读取音频文件并获取样本?

Posted

技术标签:

【中文标题】如何在 iOS 中读取音频文件并获取样本?【英文标题】:How to read an audio file in iOS and get the samples? 【发布时间】:2012-06-03 15:39:38 【问题描述】:

这是我的代码。我从 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',并获得了非常高的过零率。我该如何阅读这个音频文件?

【问题讨论】:

这里是可用的代码:github.com/fulldecent/FDWaveformView/blob/master/Source/… 【参考方案1】:

使用Extended Audio File Services

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

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

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

【讨论】:

请您说的更具体些。如何获取样品? 现在打出你需要的所有代码对我来说有点太麻烦了,而且文档已经有了。 好的。我参考了示例代码,现在我明白了它是如何工作的。谢谢。 您能告诉我们您打开了哪个示例项目吗?

以上是关于如何在 iOS 中读取音频文件并获取样本?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 iOS 中的音频剪辑中检索 PCM 样本数据?

如何在 Python 中读取类似于 Matlab audioread 的音频文件?

如何在 C# 中使用原始音频样本创建波形流?

如何从音频文件中获取样本的浮点数组

fft 在 matlab 中的音频文件样本上

如何在 iOS 5 上以编程方式规范化 PCM 音频样本?