3

他のアプリがバックグラウンドでオーディオを再生できるようにするiPhoneアプリケーションを開発しました。これを実現するために、オーディオセッションを次のように初期化します。

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];

私のアプリケーションのある時点で、CoreDataに保存されているいくつかのファイルをAVAudioPlayerで再生するためのオーディオプレーヤーを提供しています。ユーザーが再生ボタンを押すと、バックグラウンドオーディオが一時停止されます。プレーヤーが終了または一時停止すると、バックグラウンドオーディオの再生が再開されます。

プレーヤーが再生を終了した後に再開している間

-(void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag
{
    [[AVAudioSession sharedInstance] setActive:NO withFlags:AVAudioSessionSetActiveFlags_NotifyOthersOnDeactivation error:nil];
}

チャームのように機能し、一時停止後に履歴書で行き詰まります。ボタンのIBAction内でも同じように機能するはずです

-(IBAction)pausePlayer
{
    if (self.player.isPlaying) {
        [self.player pause];
        [[AVAudioSession sharedInstance] setActive:NO withFlags:AVAudioSessionSetActiveFlags_NotifyOthersOnDeactivation error:nil];
    }
}

しかし、私はいつも同じエラーを受け取ります:

Unable to deactivate audio session. Error: Error Domain=NSOSStatusErrorDomain Code=560030580 "The operation couldn’t be completed. (OSStatus error 560030580.)"

この場合、AudioSessionを非アクティブ化できない理由について何か提案はありますか?

4

2 に答える 2

1

無効化が早すぎるようです。AVAudioSession クラス リファレンスによると、「関連するオーディオ オブジェクト (キュー、コンバーター、プレーヤー、レコーダーなど) が現在実行されている場合、セッションの非アクティブ化は失敗します。」

いくつかの解決策があるようです:

  1. 成功するまで非アクティブ化をループで実行します。

    これはhttp://iknowsomething.com/ios-sdk-spritekit-sound/で提唱されています

  2. たとえば、本当に必要になるまで、非アクティブ化を延期します。

  3. Audio Queue サービスなどを使用している場合は、すぐに停止することを検討してください。(未検証)

    録音を聞く可能性のある録音アプリでは、次のシーケンスを使用してカテゴリを変更する直前にのみ無効にします: NO を有効にし、Category を設定し、YES を有効にします。

    たとえば、Apple のオーディオ セッション プログラミング ガイドの「アプリの実行中は、設定値を変更する前にオーディオ セッションを無効にすることをお勧めします」を参照してください。

于 2014-06-23T21:43:53.920 に答える