Ich habe eine App, die den MPAudioPlayerController verwendet, um auf die iPod Musikbibliothek zuzugreifen, und einen AVAudioPlayer, um Audio über die Musik zu legen. Ich habe this documentation als Leitfaden verwendet. Speziell:Audio Session "Ducking" in iOS 4 ...?
Schließlich können Sie eine Kategorie erweitern, um automatisch die Lautstärke anderer Audiodaten zu verringern, wenn Ihr Audio abgespielt wird. Dies könnte zum Beispiel in einer Übungsanwendung verwendet werden. Sagen Sie, der Benutzer trainiert gerade mit seinem iPod, wenn Ihre Anwendung eine verbale Nachricht überlagern möchte - zum Beispiel: "Sie haben 10 Minuten lang gerudert." Um sicherzustellen, dass die Nachricht aus Ihrer Anwendung verständlich ist, wenden Sie die Eigenschaft kAudioSessionProperty_OtherMixableAudioShouldDuck an Audiositzung. Wenn das Ducking stattfindet, werden alle anderen Audiodaten auf dem Gerät - abgesehen von Telefonaudio - in der Lautstärke reduziert.
Aber ich sehe dieses Verhalten nicht. In der Tat, was ich sehe (oder eher höre) ist, dass, wenn ich die AudioSession mit kAudioSessionProperty_OtherMixableAudioShouldDuck auf true gesetzt habe, die MPAudioPlayerController-Anfangslautstärke reduziert wird, und wenn ich dann auf dem MPAudioPlayerController die Lautstärke anhöre (und dann wieder spiele) wird auf "normale" Level erhöht. Die Wiedergabe des AVAudioPlayers hat keinen Einfluss auf den Audiopegel ...
Also habe ich einen einfachen Testfall eingerichtet, um dies zu reproduzieren.
In einem Viewcontroller-Header:
#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
und bei der Umsetzung:
- (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];
}
}
Ich habe ein paar UIButtons verdrahtet. Eine für musicAction (zum Abspielen/Anhalten des MPMusicPlayerControllers) und eine für die soundAction (zum Abspielen/Anhalten des AVAudioPlayers).
Wie gesagt, wenn ich auf die musicAction-Schaltfläche tippe, wird die Musik abgespielt, aber mit reduzierter Lautstärke. Wenn ich auf die soundAction-Schaltfläche tippe, wird das Overlay wiedergegeben, hat aber keinen Einfluss auf die Lautstärke des MPMusicPlayerControllers. Und noch mehr Bugs: Wenn ich den MPMusicPlayerController pausiere und spiele, erhöht sich die Lautstärke der Musik auf den Pegel, den ich hätte, wenn ich AudioSession nicht eingerichtet hätte.
Ich bin interessiert zu wissen, ob jemand anderes diese Erfahrung gemacht hat, und wenn ja, wenn Sie eine Arbeit gefunden haben (oder mir sagen können, dass ich etwas falsch mache). Sonst gehe ich wohl zu Radar.
Vielen Dank,
Levi