これが私のコードです。それらのいくつかを 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;
}
しかし、間違ったデータを取得しているようです!「ああ」という声をテストしたところ、非常に高いゼロクロス率が得られました。この音声ファイルを正確に読み取るにはどうすればよいですか?