MPAudioPlayerController を使用して iPod 音楽ライブラリにアクセスし、AVAudioPlayer を使用して音楽の上にオーディオをオーバーレイするアプリを作成しました。このドキュメントをガイドとして使用しました。具体的には:
最後に、カテゴリを拡張して、オーディオの再生中に他のオーディオの音量を自動的に下げることができます。これは、たとえば、運動アプリケーションで使用できます。アプリケーションが音声メッセージをオーバーレイしたいときに、ユーザーが iPod に向かって運動しているとします。たとえば、「あなたは 10 分間ボートを漕いでいます。アプリケーションからのメッセージが理解できるようにするには、kAudioSessionProperty_OtherMixableAudioShouldDuck プロパティをオーディオ セッションに適用します。ダッキングが行われると、電話の音声を除く、デバイス上の他のすべての音声の音量が下がります。
しかし、私はこの動作を見ていません。実際、私が見た (むしろ聞いた) ことは、kAudioSessionProperty_OtherMixableAudioShouldDuck を true に設定して AudioSession をセットアップすると、MPAudioPlayerController の初期ボリュームが減少し、MPAudioPlayerController で一時停止を呼び出す (そして再度再生する) と、ボリューム レベルが低下することです。 「通常」レベルまで上昇します。AVAudioPlayer を再生しても、オーディオ レベルには影響しません...
そこで、これを再現するための簡単なテスト ケースを設定しました。
ViewController ヘッダーで:
#import <UIKit/UIKit.h>
#import <MediaPlayer/MediaPlayer.h>
#import <AudioToolbox/AudioToolbox.h>
#import <AVFoundation/AVFoundation.h>
@interface MusicPlayerVolumeTestViewController : UIViewController <AVAudioPlayerDelegate>
{
UIButton *musicButton;
UIButton *soundButton;
AVAudioPlayer *audioPlayer;
MPMusicPlayerController *musicPlayerController;
}
@property (nonatomic, retain) IBOutlet UIButton *musicButton;
@property (nonatomic, retain) IBOutlet UIButton *soundButton;
@property (nonatomic, retain) MPMusicPlayerController *musicPlayerController;
- (IBAction)musicAction;
- (IBAction)soundAction;
@end
そして実装では:
- (void)viewDidLoad
{
[super viewDidLoad];
//Setup our Audio Session
OSStatus status = AudioSessionInitialize(NULL, NULL, NULL, NULL);
//We want our audio to play if the screen is locked or the mute switch is on
UInt32 sessionCategory = kAudioSessionCategory_MediaPlayback;
status = AudioSessionSetProperty (kAudioSessionProperty_AudioCategory, sizeof (sessionCategory), &sessionCategory);
//We want our audio to mix with other app's audio
UInt32 shouldMix = true;
status = AudioSessionSetProperty (kAudioSessionProperty_OverrideCategoryMixWithOthers, sizeof (shouldMix), &shouldMix);
//Enable "ducking" of the iPod volume level while our sounds are playing
UInt32 shouldDuck = true;
AudioSessionSetProperty(kAudioSessionProperty_OtherMixableAudioShouldDuck, sizeof(shouldDuck), &shouldDuck);
//Activate our audio session
AudioSessionSetActive(YES);
//Setup the Music Player to access the iPod music library
self.musicPlayerController = [MPMusicPlayerController applicationMusicPlayer];
[self.musicPlayerController setShuffleMode: MPMusicShuffleModeSongs];
[self.musicPlayerController setRepeatMode: MPMusicRepeatModeNone];
[self.musicPlayerController setQueueWithQuery:[MPMediaQuery songsQuery]];
//Setup a AVAudioPlayer sound to overlay against the Music Player audio
NSURL *soundURL = [NSURL URLWithString:[[NSBundle mainBundle] pathForResource:@"overlay" ofType:@"mp3"]];
NSError *error = nil;
audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:soundURL error: &error];
if (!audioPlayer)
{
NSLog(@"Could not create audio effect player: %@", [error localizedDescription]);
}
[audioPlayer prepareToPlay];
}
- (IBAction)musicAction
{
if (self.musicPlayerController.playbackState == MPMusicPlaybackStatePlaying)
{
[self.musicPlayerController pause];
}
else if (self.musicPlayerController.playbackState == MPMusicPlaybackStateStopped
|| self.musicPlayerController.playbackState == MPMusicPlaybackStatePaused)
{
[self.musicPlayerController play];
}
}
- (IBAction)soundAction
{
if (audioPlayer.playing)
{
[audioPlayer pause];
}
else
{
[audioPlayer play];
}
}
いくつかの UIButton を配線しました。1 つは musicAction (MPMusicPlayerController の再生/一時停止に使用) 用で、もう 1 つは soundAction (AVAudioPlayer の再生/一時停止に使用) 用です。
前述のように、musicAction ボタンをタップすると音楽が再生されますが、音量レベルが下がり、soundAction ボタンをタップするとオーバーレイが再生されますが、MPMusicPlayerController の音量には影響しません。さらにバグのように、MPMusicPlayerController を一時停止してから再生すると、AudioSession をセットアップしなかった場合と同じレベルまで音楽の音量が上がります。
他の誰かがこの経験をしたことがあるかどうか、もしそうなら、回避策を見つけた場合 (または、私が何か間違ったことをしていることを教えてください) を知りたいです。それ以外の場合は、レーダーに行くと思います。
どうもありがとう、
レヴィ