4

ファイルに録音せずにバックグラウンド オーディオ レベルを監視するアプリがあります。これを実現するために、/dev/null に書き込むというトリックを使用します。

このコードは、iOS 6 を搭載した iPhone 3GS、iOS 6 および iOS 7 を搭載した iPhone 4、iOS 7 および iPhone Retina (4 インチ 64 ビット) を搭載したシミュレーターで機能しました。

しかし、実際の iPhone 5s で試してみると、レコーダーは一瞬オーディオをキャプチャしたように見え、その後静かに停止します。

これはコードです:

    // Inititalize the audio

NSURL *url = [NSURL fileURLWithPath:@"/dev/null"];

NSDictionary *settings = [NSDictionary dictionaryWithObjectsAndKeys:
                          [NSNumber numberWithFloat: 44100.0],                 AVSampleRateKey,
                          [NSNumber numberWithInt: kAudioFormatAppleLossless], AVFormatIDKey,
                          [NSNumber numberWithInt: 1],                         AVNumberOfChannelsKey,
                          [NSNumber numberWithInt: AVAudioQualityMax],         AVEncoderAudioQualityKey,
                          nil];


NSError *error;

recorder = [[AVAudioRecorder alloc] initWithURL:url settings:settings error:&error];

if (recorder) {
    [recorder prepareToRecord];
    recorder.meteringEnabled = YES;
    [recorder record];
    levelTimer = [NSTimer scheduledTimerWithTimeInterval: 0.03 target: self selector: @selector(levelTimerCallback:) userInfo: nil repeats: YES];
    //        peakLevelTimer = [NSTimer scheduledTimerWithTimeInterval: 2.0 target: self selector: @selector(peakLevelTimerCallback:) userInfo: nil repeats: YES];
} else {
    NSLog(@"There was an error setting up the recorder.");        
    NSLog([error description]);
}

何が起こっているのでしょうか?

誰かが回避策を提案できますか? 実際のファイルへの書き込みは機能しますが、オーディオを監視するためだけにデバイスのスペースをいっぱいにしたくありません。薄い空気に蒸発する小さなファイル バッファに書き込む方法はありますか? 独自の /dev/null を効果的に実装しますか?

4

2 に答える 2

6

iOS 7 用のアプリの 1 つをテストしたときに、同じ問題が発生しました。

/dev/null がないことを回避するには、最初のファイルを作成し、記録が開始されてから数秒後に削除しました。アプリケーションの記録は引き続き機能し、保存されているデータ ファイルはありませんでした。

- (void)startRecording
{
  // New recording path.
  NSString *recorderFilePath = [NSString stringWithFormat:@"%@/%@.caf", [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"], @"cache"];
  NSURL *url = [NSURL fileURLWithPath:recorderFilePath];

  AVAudioRecorder recorder = [[ AVAudioRecorder alloc] initWithURL:url settings:recordSetting error:&err];

  if([recorder prepareToRecord])
  {
    [recorder record];
    NSTimer deleteFileTimer = [NSTimer scheduledTimerWithTimeInterval:15 target:self selector:@selector(removeRecordingFile) userInfo:nil repeats:NO];
  }
}

- (void)removeRecordingFile
{
  // Remove the data file from the recording.
  NSString *recorderFilePath = [NSString stringWithFormat:@"%@/%@.caf", [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"], @"cache"];
  NSFileManager *fileManager = [NSFileManager defaultManager];
  NSError *error = nil;

  BOOL success = [fileManager removeItemAtPath:recorderFilePath error:&error];

  if(success) 
  {
      NSLog(@"Deleted recording file");
  }
  else
  {
      NSLog(@"Could not delete file -:%@ ",[error localizedDescription]);
  }
}
于 2013-10-17T10:54:25.740 に答える