核心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的例子中, framecountvariables被定义为数据包的数量,而不是字节数。

我试了出来的例子,并得到了完全相同的输出(framecount * 4)0甚至-1作为AudioFileWritePackets函数调用的第三个参数。 所以对我来说,这个函数看起来不像在.h文件中定义的那样(不需要第三个参数),在那个例子中,这本书的作者也没有注意到这个错误 – 我可能是虽然错了。

Interesting Posts