Learning Core 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の3番目と5番目のパラメータは次のように定義されています。
inNumBytes 書き込まれているオーディオデータのバイト数。
ioNumPackets 入力時に、書き込むパケット数へのポインター。出力時に、実際に書き込まれたパケット数へのポインタ。
しかし、コードでは両方のパラメーターに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
ます。しかし、それは同じことです)