3

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として定義されている方法がここで定義されていることに注意してください。packetsPerBufferpacketsPerBuffer

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ます。しかし、それは同じことです)

4

1 に答える 1

3

AudioFile.hヘッダー ファイルの定義によるとAudioFileWritePackets、3 番目のパラメーターとして書き込まれるオーディオ データのバイト数を取得する必要があります。Learning Core Audio の例では、framecount変数はパケット数ではなく、パケット数として定義されています。バイト数。

例を試してみたところ、関数呼び出しの 3 番目のパラメーターとしても(framecount * 4)、まったく同じ出力が得られました。したがって、私にとっては、関数が .h ファイルで定義されているとおりに機能しないように思われます (3 番目のパラメーターは必要ありません)。その例では、本の著者もこのエラーに気付いていません。間違っていますが。0-1AudioFileWritePackets

于 2012-11-29T16:12:36.993 に答える