rdzeń audio: jak jeden pakiet = jeden bajt, gdy jednoznacznie jeden pakiet = 4 bajty

Przeglądałem podstawowe usługi konwersji audio wNauka dźwięku podstawowego i zostałem uderzony przez ten przykład w ichprzykładowy kod:

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);
}

Zauważ jakframeCount jest zdefiniowany jakopacketsPerBuffer..packetsPerBuffer jest zdefiniowane tutaj:

UInt32 outputBufferSize = 32 * 1024; // 32 KB is a good starting point
UInt32 sizePerPacket = mySettings->outputFormat.mBytesPerPacket;    
UInt32 packetsPerBuffer = outputBufferSize / sizePerPacket;

część, która mnie zakłopotałaAudioFileWritePackets nazywa się .. wdokumentacja AudioFileWritePackets trzeci i piąty parametr są zdefiniowane jako:

inNumBytes Liczba bajtów zapisywanych danych audio.

ioNumPackets Na wejściu wskaźnik do liczby pakietów do zapisania. Na wyjściu wskaźnik liczby faktycznie napisanych pakietów.

jeszcze w kodzie oba parametry są podane frameCount .. jak to możliwe? Wiem z danymi PCM 1 ramka = 1 pakiet:

// 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;

ale to samo formatowanie lPCM wyraźnie określa, że ​​na pakiet przypada 4 bajty (= 4 bajty na ramkę) ..

więc jak to działa? (to samo dotyczy drugiego przykładu z tego samego rozdziału, który używaAudioConverterFillComplexBuffer zamiastExtAudioFileReadi używa pakietów zamiast ramek ... ale to samo)

questionAnswers(1)

yourAnswerToTheQuestion