7

この問題を何日もグーグルで調べていましたが、単純な問題の解決策が見つかりませんでした。

音声を録音しながらビデオを再生しようとしています。サウンドの録音は、ビデオなしで正常に機能します。そして、ビデオは録音なしで正常に機能します。

両方を組み合わせるとすぐに、録音は音に反応しない値をスローし、ビデオは再生されなくなります。ちなみに、これは私のデバイス(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を適切に設定する方法を知っていますか?

それに関するすべてのヒントをありがとう!

乾杯、ラファエル ;)

4

1 に答える 1

14

私は同じ問題を抱えていました(AVPlayerを使用してビデオではなくオーディオを再生していることを除いて)。AVPlayer と AVAudioRecorder が同時に開始されると、オーディオ ルーティングの変更をリッスンし始めることをお勧めします。

AudioSessionAddPropertyListener(kAudioSessionProperty_AudioRouteChange,
                                audioRouteChangeListenerCallback,
                                self);

コールバックで、カテゴリとルート (kAudioSessionProperty_AudioRoute) を出力します。オーディオの再生と録音を同時に機能させる唯一の方法は、次の場合でした。

  1. オーディオ セッションは AVAudioSessionCategoryPlayAndRecord で、kAudioSessionProperty_OverrideCategoryMixWithOthers プロパティは true でした。

  2. 録音前に再生を開始しました。AVAudioRecorder prepareToRecord が呼び出された後、オーディオ ルートの変更を取得するまで録音を開始しないでください。先に録音を開始しても失敗しませんが、音声ルートの変更により録音が失敗するようです。

他の組み合わせも試しましたが、毎回うまくいくのはこれだけです。

于 2011-12-09T01:10:00.193 に答える