1

この質問の目的のために、私のアプリが10秒ごとにオーディオクリップを再生すると想像してください。このオーディオは、AVAudioPlayerを使用して、デバイス上のiPodミュージックプレーヤーと(ダッキングを使用して)再生/ミキシングします。アプリがバックグラウンドに送信されると、オーディオファイルが参照されている(テキストがない)UILocalNotificationオブジェクトをスケジュールするため、サウンドは10秒間隔で再生され続けます。

私を悩ませているのは、iOS 6で通知の一部として再生されるオーディオクリップの音量が、アプリで再生するときのオーディオの2倍の音量に見えることです(音量を1.0fに設定しています。ドキュメントによると最大です)。そのため、アプリは10秒ごとにサウンドを再生し、バックグラウンドに送信すると、アプリ内のサウンドと比較して非常に大きな音になります。

関連するスニペット...アプリの起動、ダッキングを有効にするためにAVAudioSessionを設定する方法は次のとおりです。

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

UInt32 doChangeDefaultRoute = 1;
AudioSessionSetProperty (kAudioSessionProperty_OverrideCategoryDefaultToSpeaker, sizeof (doChangeDefaultRoute), &doChangeDefaultRoute);

OSStatus propertySetError = 0;
UInt32 allowMixing = true;
propertySetError = AudioSessionSetProperty (kAudioSessionProperty_OverrideCategoryMixWithOthers,sizeof (allowMixing),&allowMixing);

...プレーヤーの作成方法:

- (AVAudioPlayer *)playerWithCAFFileNamed:(NSString *)fname {
    NSURL *u = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:fname ofType:@"caf"]];
    NSData *d = [NSData dataWithContentsOfURL:u];
    AVAudioPlayer *p = [[AVAudioPlayer alloc] initWithData:d error:nil];
    p.delegate = self;
    p.volume = 1.0; 
    [p prepareToPlay];
    return p;
}

...そして再生:

- (void)playAudio:(AVAudioPlayer *)player {
    [self setSessionActiveWithMixing:YES];
    [player setVolume:1.0]; // should already be set, but just to be sure
    [player play];
}

...そしてこれが私が超大音量の通知を作成する方法です:

- (UILocalNotification *)notificationWithSoundNamed:(NSString *)sound atTimeInterval:(NSTimeInterval)ti {
    UILocalNotification *n = [[UILocalNotification alloc] init];
    n.soundName = sound;
    n.fireDate = [NSDate dateWithTimeIntervalSinceReferenceDate:ti];
    return n;
}
4

2 に答える 2

1

Apple でオープンしたバグは、「設計どおりの機能」としてクローズされました。彼らの簡単な説明:

通知音は着信音の音量に従います。AVAudioPlayer はメディアの音量に従います。

... 次に、呼び出し音を確実に聞くために、呼び出し音の音量を最大のメディア音量よりも大きくすることが許可されていると仮定できると思います。私は推測する。

于 2013-02-18T16:17:59.020 に答える
0

AVAudioPlayer ボリュームで同様の問題に直面しました。そこで、割り当てたい値を、取得したいものの係数で割りました。ただし、理由を見つける価値があります。

于 2013-01-27T17:37:01.593 に答える