如何在 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 中读取音频文件并获取样本?的主要内容,如果未能解决你的问题,请参考以下文章