Аудио Сессия, “Ныряющая” Прерванный iOS 4 …?

У меня есть приложение, которое использует MPAudioPlayerController для доступа к музыкальной библиотеке iPod и AVAudioPlayer для накладывания аудио сверху музыки. Я использовал эту документацию в качестве руководства. Конкретно:

Наконец, можно улучшить категорию для автоматического понижения объема другого аудио, когда аудио играет. Это могло использоваться, например, в приложении осуществления. Скажите, что пользователь тренируется их iPod, когда Ваше приложение хочет наложить словесное сообщение — например, “Вы располагали в ряд в течение 10 минут”. Чтобы гарантировать, что сообщение из Вашего приложения понятно, примените kAudioSessionProperty_OtherMixableAudioShouldDuck свойство к аудио сессии. Когда ныряние происходит, все другое аудио на устройстве — кроме телефонного аудио — понижается в объеме.

Но я не вижу это поведение. На самом деле то, что я вижу (или слышат, скорее), - то, что, если я устанавливаю AudioSession с набором kAudioSessionProperty_OtherMixableAudioShouldDuck к истинному, объем начальной буквы MPAudioPlayerController уменьшается, и если я затем называю паузу (и затем играю снова) на MPAudioPlayerController, уровень громкости увеличен до "нормальных" уровней. Проигрывание AVAudioPlayer не имеет никакого влияния на уровне звука...

Таким образом, я настроил простой тестовый сценарий для репродуцирования этого.

В заголовке ViewController:

#import 
#import 
#import 
#import 

@interface MusicPlayerVolumeTestViewController : UIViewController 
{
    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.

Мне интересно знать, был ли у кого-либо еще этот опыт, и раз так если Вы нашли работу вокруг (или может сказать мне, что я делаю что-то не так). Иначе я предполагаю, что я прочь к Радару.

Большое спасибо,

Levi

8
задан levigroker 20 July 2010 в 19:33
поделиться

1 ответ

В документации неясно, каким должно быть ожидаемое поведение при нырянии, но я обнаружил, что если вы настроите свой аудиосеанс для уклона, когда вы активируете аудиосеанс, он отключается, а когда вы его деактивируете, он отключается. Таким образом, вы должны продолжать активировать и деактивировать аудиосеанс, чтобы приглушить музыку только для вашей звуковой реплики.

Я обнаружил одну ошибку: если вы деактивируете аудиосеанс, находясь внутри метода audioPlayerDidFinishPlaying: успешно: вашего AVAudioPlayerDelegate , приглушение не удаляется, а громкость держится на одном уровне. Я уже подал радар по этому поводу, но это не повредит, если другие файлы будут похожи. Фактически, это, вероятно, заставит их исправить это.

То, что вы делаете, - это запускаете аудиосеанс и оставляете его включенным, чтобы он немедленно пригнулся и оставался пригнанным, чтобы он больше не приглушал музыку, когда вы воспроизводите звук. Проблема с увеличением громкости музыки после приостановки и воспроизведения музыки звучит как ошибка.

2
ответ дан 5 December 2019 в 12:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: