2

ExtAudioFileWriteAsync を使用して、デバイス録音の使用中にオーディオ ファイルを書き込んでいますが、録音が終了したら、ExtAudioFileRead 関数を使用して読み込もうとしますが、取得したサンプルは、私が書いているサンプルとは異なります...なぜこれが起こる可能性がありますか?

書き込み用:

self.audioManager.inputBlock = ^(float *data, UInt32 numFrames, UInt32 numChannels) {
  for (int i = 0; i < numFrames*numChannels; i++) {
        printf("write*%f\n", data[i]);
  }

  UInt32 numIncomingBytes = numFrames*numChannels*sizeof(float);
  UInt32 *outputBuffer =(UInt32*)malloc(numIncomingBytes);
  memcpy(outputBuffer, recordedData, numIncomingBytes);

  AudioBufferList outgoingAudio;
  outgoingAudio.mNumberBuffers = 1;
  outgoingAudio.mBuffers[0].mNumberChannels = numChannels;
  outgoingAudio.mBuffers[0].mDataByteSize = numIncomingBytes;
  outgoingAudio.mBuffers[0].mData = self.outputBuffer;

  if( 0 == pthread_mutex_trylock( &outputAudioFileLock ) ) 
  {       
      ExtAudioFileWriteAsync(outputFile, numFrames, &outgoingAudio);
  }
  pthread_mutex_unlock( &outputAudioFileLock );    
};
[self.audioManager play];

読むために:

UInt32 *outputBuffer = (UInt32 *)malloc(numFrames*numChannels*sizeof(float));

AudioBufferList convertedData;
convertedData.mNumberBuffers = 1;
convertedData.mBuffers[0].mNumberChannels = numChannels;
convertedData.mBuffers[0].mDataByteSize = numFrames*numChannels*sizeof(float);
convertedData.mBuffers[0].mData = outputBuffer;

NSMutableArray *samplesArray = [[NSMutableArray alloc]init];
while (numFrames > 0) {
    ExtAudioFileRead(inputFile, &numFrames, &convertedData);
    if (numFrames > 0)  {
        AudioBuffer audioBuffer = convertedData.mBuffers[0];
        float *samples = (float *)audioBuffer.mData;
        for (int i = 0; i < frameCount*numChannels; i++) {
            printf("read*%f\n", samples[i]);
        }
    }
}

ところで、デバイスのオーディオを取得するためにNovocaineプロジェクトを使用しています。Novocaineコードまたは他のプレーヤーで保存されたオーディオを再生できます。

ExtAudioFileRef 出力を書き込む場合:

 ExtAudioFileCreateWithURL(audioFileRef, kAudioFileM4AType,   &outputFileDesc, NULL, kAudioFileFlags_EraseFile, &outputFile);

outputFileDesc の場所

AudioStreamBasicDescription outputFileDesc = {44100.0, kAudioFormatMPEG4AAC, 0, 0, 1024, 0, thisNumChannels, 0, 0}; outputFileDesc.mFormatFlags = kAudioFormatFlagIsBigEndian | kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked;

ExtAudioFileRef inputFile を読み取る場合:

ExtAudioFileOpenURL(audioFileRef, &inputFile):

どちらの場合も (書き込みと読み取り)、同じ形式が適用されます。

AudioStreamBasicDescription outputFormat;
_outputFormat.mSampleRate = self.samplingRate;
_outputFormat.mFormatID = kAudioFormatLinearPCM;
_outputFormat.mFormatFlags = kAudioFormatFlagIsFloat;
_outputFormat.mBytesPerPacket = 4*self.numChannels;
_outputFormat.mFramesPerPacket = 1;
_outputFormat.mBytesPerFrame = 4*self.numChannels;
_outputFormat.mChannelsPerFrame = self.numChannels;
_outputFormat.mBitsPerChannel = 32;


ExtAudioFileSetProperty(outputFile, kExtAudioFileProperty_ClientDataFormat, sizeof(AudioStreamBasicDescription), &_outputFormat);


 ExtAudioFileSetProperty(inputFile, kExtAudioFileProperty_ClientDataFormat, sizeof(AudioStreamBasicDescription), &_outputFormat);

ちなみに、読み取りサンプルと書き込みサンプルが等しくなくても、両方の信号の平均値は非常に似ています。しかし、完全に等しくない理由がよくわかりません!

私が間違っていることは何か分かりますか?

4

1 に答える 1

1

ExtaudioFileRefs の 1 つまたは両方からの暗黙的なフォーマット変換があり、変換の結果として異なるサンプルが表示されているようです。audio_in_format、file_format、および audio_out_format の 3 つの形式があります。audio_in_format が file_format と異なる場合、ExtAudioFileRef を書き込むと、ディスクに書き込む前に入力オーディオを file_format に変換するためのオーディオ コンバータが作成されます。また、file_format が audio_out_format と異なる場合、ExtAudioFileRef を読み取るとコンバータも作成されます。

意見: 書き込み ExtAudioFileRef を「outputFile」、読み取り ExtAudioFileRef を「inputFile」と名付けたのは紛らわしいです。audioWriter や audioReader などを使用します。

于 2015-09-21T16:18:14.777 に答える