У меня есть приложение, которое использует MPAudioPlayerController для доступа к музыкальной библиотеке iPod и AVAudioPlayer для наложения звука поверх музыки. В качестве руководства я использовал this documentation. В частности:Аудиозапись «Ducking» Сломанная в iOS 4 ...?
Наконец, вы можете улучшить категорию, чтобы автоматически понижать громкость другого звука при воспроизведении звука. Это можно использовать, например, в приложении для упражнений. Скажите, что пользователь упражняется на своем iPod, когда ваше приложение хочет наложить вербальное сообщение, например: «Вы грести в течение 10 минут». Чтобы сообщение из вашего приложения было понятным, примените свойство kAudioSessionSizeSourceSource аудио сессии. Когда происходит уклонение, все остальные аудио на устройстве, кроме звука телефона, уменьшаются в объеме.
Но я не вижу такого поведения. Фактически, то, что я вижу (или слышу, скорее), состоит в том, что, если я настрою AudioSession с kAudioSessionProperty_OtherMixableAudioShouldDuck равным true, начальный том 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];
}
}
Я подключен на пару UIButtons. Один для musicAction (используется для воспроизведения/приостановки MPMusicPlayerController) и один для soundAction (используется для воспроизведения/приостановки AVAudioPlayer).
Как уже упоминалось, если я нажимаю кнопку musicAction, музыка воспроизводится, но на пониженном уровне громкости, и если я нажимаю кнопку soundAction, наложение воспроизводится, но не влияет на громкость MPMusicPlayerController. И, что больше похоже на ошибку, это то, что когда я останавливаюсь, а затем проигрываю MPMusicPlayerController, громкость музыки увеличивается до уровня, который был бы, если бы я не настраивал AudioSession.
Мне интересно узнать, имел ли кто-либо еще этого опыта, и если да, если вы нашли работу (или можете сказать мне, что я делаю что-то неправильно). В противном случае, я думаю, я ухожу в Радар.
Большое спасибо,
Леви