簡體   English   中英

核心音頻:當一個數據包= 4個字節時,一個數據包如何=一個字節

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM