核心audio:当一个数据包= 4个字节时,一个数据包如何能够=一个字节
我正在学习核心audio中的核心audio转换服务,我在他们的示例代码中被这个例子所震惊:
while(1) { // wrap the destination buffer in an AudioBufferList AudioBufferList convertedData; convertedData.mNumberBuffers = 1; convertedData.mBuffers[0].mNumberChannels = mySettings->outputFormat.mChannelsPerFrame; convertedData.mBuffers[0].mDataByteSize = outputBufferSize; convertedData.mBuffers[0].mData = outputBuffer; UInt32 frameCount = packetsPerBuffer; // read from the extaudiofile CheckResult(ExtAudioFileRead(mySettings->inputFile, &frameCount, &convertedData), "Couldn't read from input file"); if (frameCount == 0) { printf ("done reading from file"); return; } // write the converted data to the output file CheckResult (AudioFileWritePackets(mySettings->outputFile, FALSE, frameCount, NULL, outputFilePacketPosition / mySettings->outputFormat.mBytesPerPacket, &frameCount, convertedData.mBuffers[0].mData), "Couldn't write packets to file"); // advance the output file write location outputFilePacketPosition += (frameCount * mySettings->outputFormat.mBytesPerPacket); }
请注意frameCount
是如何定义为packetsPerBuffer
..在这里定义了packetsPerBuffer
:
UInt32 outputBufferSize = 32 * 1024; // 32 KB is a good starting point UInt32 sizePerPacket = mySettings->outputFormat.mBytesPerPacket; UInt32 packetsPerBuffer = outputBufferSize / sizePerPacket;
那个难倒我的部分是AudioFileWritePackets
被调用..在文档 AudioFileWritePackets第三和第五个参数被定义为:
inNumBytes 正在写入的audio数据的字节数。
ioNumPackets 在input时,指向要写入的数据包的数量。 在输出上,指向实际写入的数据包数量的指针。
但在代码中这两个参数都给了frameCount ..这怎么可能? 我知道PCM数据1帧= 1包:
// define the ouput format. AudioConverter requires that one of the data formats be LPCM audioConverterSettings.outputFormat.mSampleRate = 44100.0; audioConverterSettings.outputFormat.mFormatID = kAudioFormatLinearPCM; audioConverterSettings.outputFormat.mFormatFlags = kAudioFormatFlagIsBigEndian | kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked; audioConverterSettings.outputFormat.mBytesPerPacket = 4; audioConverterSettings.outputFormat.mFramesPerPacket = 1; audioConverterSettings.outputFormat.mBytesPerFrame = 4; audioConverterSettings.outputFormat.mChannelsPerFrame = 2; audioConverterSettings.outputFormat.mBitsPerChannel = 16;
但是相同的lPCM格式也清楚地表明每个数据包有4个字节(每帧4个字节)。
那么这是如何工作的? (这同样适用于使用AudioConverterFillComplexBuffer
而不是ExtAudioFileRead
的同一章节中的另一个示例,并使用数据包而不是帧..但它是相同的东西)
我认为你是对的,根据AudioFile.h
头文件中的定义, AudioFileWritePackets
应该把正在写入的audio数据的字节数作为第三个参数,在Learning Core Audio的例子中, framecount
variables被定义为数据包的数量,而不是字节数。
我试了出来的例子,并得到了完全相同的输出(framecount * 4)
, 0
甚至-1
作为AudioFileWritePackets
函数调用的第三个参数。 所以对我来说,这个函数看起来不像在.h文件中定义的那样(不需要第三个参数),在那个例子中,这本书的作者也没有注意到这个错误 – 我可能是虽然错了。