7

アプリがバックグラウンドにあるときに、仮想楽器アプリを (MIDI キーボード経由で) 使用できるようにしたいと考えています。これは、UIBackgroundModes を「audio」に設定し、AudioSessions のカテゴリを AVAudioSessionCategoryPlayback に設定することでうまく機能します。さらに、ミュージック プレーヤー アプリとのミキシングを可能にするために、プロパティ kAudioSessionProperty_OverrideCategoryMixWithOthers を設定します。

バッテリーのエネルギーを節約するために、バックグラウンド操作が不要な場合はユーザーがオフにできるようにすることをお勧めします。したがって、私のアプリには、カテゴリ AVAudioSessionCategoryAmbient とカテゴリ AVAudioSessionCategoryPlayback (kAudioSessionProperty_OverrideCategoryMixWithOthers を使用) を切り替えるスイッチがあります。コードは次のようになります (エラー処理は省略)。

NSString *category = supportsBackgroundOperation ? AVAudioSessionCategoryPlayback : AVAudioSessionCategoryAmbient;

[session setCategory:category error:nil];

if (category == AVAudioSessionCategoryPlayback) {
    UInt32 allowMixing = true;
    AudioSessionSetProperty(kAudioSessionProperty_OverrideCategoryMixWithOthers, sizeof(allowMixing), &allowMixing);
}

ここでの問題: 音楽アプリケーションがバックグラウンドで再生されているとします。ユーザーは、フォアグラウンドで (MIDI キーボードを介して) 仮想楽器を演奏して音楽プレーヤーを伴奏し、さらに別のアプリを開始することにしました。たとえば、楽器を演奏する理由を楽しむためのスライド ショーです。それで彼/彼女は私のアプリの設定ビューに行き、バックグラウンド操作を有効にします。次に、上記のコードが実行されます。ブーム、音楽アプリケーションが静かになります。私が理解しているように、kAudioSessionProperty_OverrideCategoryMixWithOthers プロパティは、カテゴリを設定した後にのみ設定できますが、カテゴリを AVAudioSessionCategoryPlayback に設定すると、kAudioSessionProperty_OverrideCategoryMixWithOthers を設定する前に、音楽プレーヤーがシステムによってミュートされます。

これは起こりましたか?何かできることはありますか?カテゴリを変更する前後にセッションを非アクティブ化/アクティブ化しようとしましたが、別の問題が発生しました。

マーカス

4

3 に答える 3

18

iOS 6.0以降、使用できます

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

スイフト5:

try? AVAudioSession.sharedInstance().setCategory(.playback, options: .mixWithOthers)
于 2013-03-26T12:29:26.437 に答える
16

これを達成できます。原則として、最初にオーディオ セッションを無効にし、オーディオ セッションのすべてのプロパティを設定してから、オーディオ セッションをアクティブにします。これにより、他のアプリで再生されている音楽が無音になることはありません。

// Initialize audio session
AVAudioSession *audioSession = [AVAudioSession sharedInstance];

// Active your audio session
[audioSession setActive: NO error: nil];

// Set audio session category
[audioSession setCategory:AVAudioSessionCategoryPlayback error:nil];

// Modifying Playback Mixing Behavior, allow playing music in other apps
OSStatus propertySetError = 0;
UInt32 allowMixing = true;

propertySetError = AudioSessionSetProperty (
                       kAudioSessionProperty_OverrideCategoryMixWithOthers,
                       sizeof (allowMixing),
                       &allowMixing);

// Active your audio session
[audioSession setActive: YES error: nil];

このソリューションは私にとってはうまくいきます。しかし、あなたの説明から、カテゴリを変更する前後にセッションをアクティブ化/非アクティブ化しようとしたが、他の問題が発生したと述べました。上記とまったく同じ方法で無効化/有効化を行いましたか? もしそうなら、他のトラブルについてもっと情報を提供してください。

于 2012-05-28T14:17:55.583 に答える
-6

私はM0rph3v5に反対しなければなりません。

withOptions パラメーターの唯一の有効な値は次のとおりです。AVAudioSessionInterruptionOptionShouldResume

于 2013-04-25T07:07:21.023 に答える