この問題を何日もグーグルで調べていましたが、単純な問題の解決策が見つかりませんでした。
音声を録音しながらビデオを再生しようとしています。サウンドの録音は、ビデオなしで正常に機能します。そして、ビデオは録音なしで正常に機能します。
両方を組み合わせるとすぐに、録音は音に反応しない値をスローし、ビデオは再生されなくなります。ちなみに、これは私のデバイス(iPhone 4 / iOS5)でのみ発生します。シミュレーターでは、すべて正常に動作します。
これは、ViewController にある私のコードの縮小版です。
// Audio Recorder
NSURL *nullUrl = [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 *recorderError;
_recorder = [[AVAudioRecorder alloc] initWithURL:nullUrl settings:settings error:&recorderError];
if (_recorder)
{
[_recorder prepareToRecord];
_recorder.meteringEnabled = YES;
[_recorder record];
_levelTimer = [NSTimer scheduledTimerWithTimeInterval:0.05 target:self selector:@selector(levelTimerCallback:) userInfo:nil repeats:YES];
}
// Video Player
NSURL *url = [[NSBundle mainBundle] URLForResource:@"Video"
withExtension:@"mp4"
subdirectory:nil];
_avPlayer = [[AVPlayer playerWithURL:url] retain];
_avPlayerLayer = [[AVPlayerLayer playerLayerWithPlayer:_avPlayer] retain];
_avPlayerLayer.frame = self.view.layer.bounds;
[self.view.layer addSublayer:_avPlayerLayer];
[_avPlayer play];
レコーダは、levelTimerCallback メソッドで読み取った値を出力するだけです。ビデオは短いビデオを再生するだけです。
AVAudioSession のカテゴリを設定する必要があることがわかりました。アプリの起動後にこのコードを実装すると、ビデオは再生されますが、レコーダーはサウンドに反応せずに同じ値を出力します。
NSError *error = nil;
AVAudioSession *audioSession = [AVAudioSession sharedInstance];
[audioSession setCategory:AVAudioSessionCategoryPlayAndRecord error:&error];
[audioSession setActive:YES error:&error];
AudioSessionSetPropertyで何かをしなければならないかもしれないと想像できました
UInt32 sessionCategory = kAudioSessionCategory_PlayAndRecord;
AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(sessionCategory), &sessionCategory);
UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker;
AudioSessionSetProperty (kAudioSessionProperty_OverrideAudioRoute,sizeof (audioRouteOverride),&audioRouteOverride);
しかし、それは何も変わりません。私が欠けているもの、またはAudioSessionを適切に設定する方法を知っていますか?
それに関するすべてのヒントをありがとう!
乾杯、ラファエル ;)