Как воспроизвести звук с помощью AVAudioPlayer в режиме без звука в iPhone

Я хочу воспроизводить звук даже в бесшумном режиме на iPhone.

Можно ли это сделать с помощью AVAudioPlayer (без использования AVAudioSession).

(для ios 3.0 +)

Спасибо заранее.

Ответы

Ответ 1

Собственно, вы можете это сделать. Он управляется с помощью аудио сессии и не имеет ничего общего с AVAudioPlayer. Почему вы не хотите использовать AudioSession? Они играют хорошо вместе...

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

    AudioSessionInitialize (NULL, NULL, NULL, NULL);
    AudioSessionSetActive(true);

    // Allow playback even if Ring/Silent switch is on mute
    UInt32 sessionCategory = kAudioSessionCategory_MediaPlayback;
    AudioSessionSetProperty (kAudioSessionProperty_AudioCategory, 
                             sizeof(sessionCategory),&sessionCategory);

У меня есть приложение, которое я делаю именно так, и использую AVAudioPlayer для воспроизведения звука, а при включенном кольцевом/бесшумном переключателе я слышу звук.

ОБНОВЛЕНИЕ (11/6/2013)

В приложении, о котором я упоминал выше, где я успешно использовал код выше, у меня (в течение некоторого времени) вместо этого использовался следующий код:

        AVAudioSession *audioSession = [AVAudioSession sharedInstance];
        NSError *error = nil;
        BOOL result = NO;
        if ([audioSession respondsToSelector:@selector(setActive:withOptions:error:)]) {
            result = [audioSession setActive:YES withOptions:0 error:&error]; // iOS6+
        } else {
            [audioSession setActive:YES withFlags:0 error:&error]; // iOS5 and below
        }
        if (!result && error) {
            // deal with the error
        }

        error = nil;
        result = [audioSession setCategory:AVAudioSessionCategoryPlayback error:&error];

        if (!result && error) {
            // deal with the error
        }

Я думал, что опубликую это как альтернативу, в свете последнего комментария к этому ответу.: -)

Ответ 2

Решение MarkGranoff является правильным. Однако, если вы предпочитаете делать это в Obj-c вместо C, также работает следующее:

    NSError *error = nil;
    [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:&error];
    [[AVAudioSession sharedInstance] setActive:YES error:&error];

Ответ 3

Вышеуказанные ответы верны. Ниже приведена версия Swift.

do {
    try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
    //print("AVAudioSession Category Playback OK")
    do {
        try AVAudioSession.sharedInstance().setActive(true)
        //print("AVAudioSession is Active")
    } catch _ as NSError {
        //print(error.localizedDescription)
    }
} catch _ as NSError {
    //print(error.localizedDescription)
}