[英]core audio: how can one packet = one byte when clearly one packet = 4 bytes
我正在學習核心音頻中的核心音頻轉換服務,我在他們的示例代碼中被這個例子所震驚:
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 正在寫入的音頻數據的字節數。
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
的同一章中的另一個例子,並使用數據包而不是幀......但它是一樣的)
我認為你是對的,根據AudioFile.h
頭文件中的定義, AudioFileWritePackets
應該將被寫入的音頻數據的字節數作為第三個參數,並且在該Learning Core Audio示例中, framecount
變量被定義為數據包數,而不是字節數。
我嘗試了這些示例並獲得與(framecount * 4)
, 0
和偶數-1
完全相同的輸出作為AudioFileWritePackets
函數調用的第三個參數。 所以對我來說,似乎該函數不能完全按照.h文件中的定義工作(不需要第三個參數),並且在該示例中,本書的作者也沒有注意到這個錯誤 - 我可能是雖然錯了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.