我有一個應用程序,它使用MPAudioPlayerController來訪問iPod音樂庫,以及一個AVAudioPlayer來覆蓋音樂上的音頻。我用this documentation作爲指導。具體來說:在iOS 4中破壞的音頻會話「Ducking」...?
最後,您可以增強一個類別,以在播放音頻時自動降低其他音頻的音量。例如,這可以在練習應用程序中使用。假設用戶在應用程序要覆蓋口頭消息時正在鍛鍊iPod,例如「您已經划船10分鐘」。要確保應用程序的消息可以理解,請將kAudioSessionProperty_OtherMixableAudioShouldDuck屬性應用於音頻會話。當發生低音時,設備上的所有其他音頻(除了手機音頻)都會降低音量。
但我沒有看到這種行爲。實際上,我所看到的(或聽到的)是,如果我將kAudioSessionProperty_OtherMixableAudioShouldDuck設置爲true,MPAudioPlayerController初始音量減少,如果我在MPAudioPlayerController上調用暫停(然後再次播放),音量級別得到增加到「正常」的水平。播放AVAudioPlayer對音頻電平沒有任何影響...
所以我設置了一個簡單的測試用例來重現此問題。
在視圖控制器頭:
#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];
}
}
我有線了一對夫婦UIButtons。一個用於musicAction(用於播放/暫停MPMusicPlayerController),另一個用於soundAction(用於播放/暫停AVAudioPlayer)。如上所述,如果我點擊musicAction按鈕,音樂會播放,但音量會降低,如果點擊soundAction按鈕,覆蓋層將播放,但不會影響MPMusicPlayerController的音量。而且,更像錯誤的是,當我暫停並播放MPMusicPlayerController時,音樂音量增加到如果我沒有設置AudioSession時的音量。
我很想知道是否有其他人有過這樣的經歷,如果有的話,如果你找到了解決辦法(或者可以告訴我,我做錯了什麼)。否則,我想我已經去過雷達了。
非常感謝,
列維