gpt4 book ai didi

objective-c - 核心音频 : how can one packet = one byte when clearly one packet = 4 bytes

转载 作者:搜寻专家 更新时间:2023-10-30 20:20:13 27 4
gpt4 key购买 nike

我正在研究 中的核心音频转换服务 Learning Core Audio 我对他们 sample code 中的这个例子感到震惊:

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;

让我难过的部分是 AudioFileWritePacketsdocumentation 中被调用。 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 文件中定义的那样工作(不需要第三个参数),而且在那个例子中,本书的作者也没有注意到这个错误——我可能是虽然错了。

关于objective-c - 核心音频 : how can one packet = one byte when clearly one packet = 4 bytes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13604612/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com