1

RemoteIO を使用して、マイクからの着信オーディオ ストリームの分析を正常に実行しています。ただし、ファイルをディスクに書き込むことはできないようです。私はいくつかの質問を読みました:

そして、そこに提案を実装しようとしました:それらが機能していないことを除いて。ExtAudioFileWriteAsync を呼び出す正しい場所はどこですか? また、どのように設定すればよいですか?

4

1 に答える 1

3

RemoteIO 自体のセットアップ プロセス(かなり骨が折れますが、 Apple のサンプル コードでカバーされています) を除けば、洞察の重要なポイントは次のとおりです。

  1. 最初にストリームをセットアップするために使用したのと同じAudioStreamBasicDescription( ) を使用します。*audioFormat他の質問や投稿に基づいて、パラメーターがわずかに異なる新しいパラメーターを設定するのにどれだけの時間を費やしたかわかりません。ivar からストリーム属性を参照するだけで十分でした。
  2. 「isRecording」ブール値を設定して、RemoteIO セッションを破棄して再セットアップしなくても、ファイルへの書き込みをオンまたはオフにできるようにします。
  3. recordingCallbackええと、コールバックでファイルに書き込むことは問題ありませんが、非同期で行います。PlaybackCallback でそれを行うか、3 番目の audioFileWriteCallback を設定することについて多くの情報が語られています。これにより、サイレント ファイルまたは 4KB (つまり空の) ファイルが生成されました。やらないでください。
  4. また、コールバックに渡された ioDataのコピーを必ず使用してください。

recordingCallbackAudioUnitRenderbufferList: _

    AudioDeviceManager* THIS = (__bridge AudioDeviceManager *)inRefCon;
    if (THIS->isRecording) {
      ExtAudioFileWriteAsync(THIS->extAudioFileRef, inNumberFrames, bufferList);
    }
  1. 参考までに、記録機能の開始と停止:

-(void)startRecording {

  NSArray  *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
  NSString *documentsDirectory = [paths objectAtIndex:0];
  NSString *destinationFilePath = [documentsDirectory stringByAppendingPathComponent:kAudioFileName];
  CFURLRef destinationURL = CFURLCreateWithFileSystemPath(kCFAllocatorDefault, (CFStringRef)destinationFilePath, kCFURLPOSIXPathStyle, false);

  OSStatus status;

  // create the capture file
  status = ExtAudioFileCreateWithURL(destinationURL, kAudioFileWAVEType, &audioFormat, NULL, kAudioFileFlags_EraseFile, &extAudioFileRef);
  if (status) NSLog(@"Error creating file with URL: %ld", status);

 // use the same "audioFormat" AudioStreamBasicDescription we used to set up RemoteIO in the first place
  status = ExtAudioFileSetProperty(extAudioFileRef, kExtAudioFileProperty_ClientDataFormat, sizeof(AudioStreamBasicDescription), &audioFormat);

  ExtAudioFileSeek(extAudioFileRef, 0);
  ExtAudioFileWrite(extAudioFileRef, 0, NULL);

  isRecording = YES;
}

- (void)stopRecording {

  isRecording = NO;
  OSStatus status = ExtAudioFileDispose(extAudioFileRef);
  if (status) printf("ExtAudioFileDispose %ld \n", status);
}

それでおしまい!

于 2012-11-21T20:45:30.990 に答える