AVAudioPlayer через динамики - PullRequest
       39

AVAudioPlayer через динамики

5 голосов
/ 18 апреля 2010

Я получил следующий код:

- (id)init {
    if (self = [super init]) {
        UInt32 sessionCategory = kAudioSessionCategory_MediaPlayback;
        AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(sessionCategory), &sessionCategory);    

        UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker;
        AudioSessionSetProperty (kAudioSessionProperty_OverrideAudioRoute,sizeof (audioRouteOverride),&audioRouteOverride);

        [[AVAudioSession sharedInstance] setDelegate:self];
        [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error:nil];
        [[AVAudioSession sharedInstance] setActive:YES error:nil];
    }
    return self;
}

Но как-то звук не хочет выходить из динамиков, кто-то может увидеть, что я делаю не так?

Код, который я использую для игры:

AVAudioPlayer *player = [[AVAudioPlayer alloc] initWithContentsOfURL:soundFilePathURL error:nil];
[player prepareToPlay];
[player setVolume:1.0];
[player play];

Ответы [ 8 ]

4 голосов
/ 02 ноября 2013

Для iOS7 AudioSessionSetProperty устарела. Ответ в следующем посте от Foundry показывает, как это сделать для iOS7:

https://stackoverflow.com/a/18808124/1949877

4 голосов
/ 28 мая 2013

Придирчиво к тому, как вы это настроили ...

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error:nil];
UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker;
AudioSessionSetProperty(kAudioSessionProperty_OverrideAudioRoute, sizeof(audioRouteOverride), &audioRouteOverride);

Очень важно использовать AVAudioSessionCategoryPlayAndRecord, иначе маршрут не дойдет до динамика. После того, как вы установили маршрут переопределения для аудио сеанса, вы можете использовать экземпляр AVAudioPlayer и отправить некоторый вывод на динамик.

Надеюсь, что это работает для других, как и для меня. Документация по этому вопросу разбросана, но приложение Skype доказывает, что это возможно. Продолжай, друзья мои! :)

Некоторая документация Apple здесь: http://developer.apple.com/library/ios/#documentation/AudioToolbox/Reference/AudioSessionServicesReference/Reference/reference.html

Выполнить поиск на странице для kAudioSessionProperty_OverrideAudioRoute

3 голосов
/ 14 мая 2015

Очень хороший пример здесь http://ruckt.info/playing-sound-through-iphone-speaker/ Решил мою проблему.

Метод ниже - configureAVAudioSession - перенаправляет звук на основные динамики в iOS 7.0. Для этого позвоните перед воспроизведением звука следующим образом: [self configureAVAudioSession].

- (void) configureAVAudioSession //To play through main iPhone Speakers
{
    //get your app's audioSession singleton object
    AVAudioSession* session = [AVAudioSession sharedInstance];

    //error handling
    BOOL success;
    NSError* error;

    //set the audioSession category.
    //Needs to be Record or PlayAndRecord to use audioRouteOverride:

    success = [session setCategory:AVAudioSessionCategoryPlayAndRecord error:&error];

    if (!success)  
    {
        NSLog(@"AVAudioSession error setting category:%@",error);
    }
    //set the audioSession override
    success = [session overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:&error];
    if (!success)  
    {
        NSLog(@"AVAudioSession error overrideOutputAudioPort:%@",error);
    }
    //activate the audio session
    success = [session setActive:YES error:&error];
    if (!success) 
    {
        NSLog(@"AVAudioSession error activating: %@",error);
    }
    else 
    {
        NSLog(@"audioSession active");
    }
}
2 голосов
/ 20 февраля 2011

Я просто собираюсь уточнить это для других читателей этого поста.

Я искал ответ на эту проблему, в частности, для примера SpeakHere. Я взял этот маленький кусок кода, и он добился цели.

 UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker;
    AudioSessionSetProperty (kAudioSessionProperty_OverrideAudioRoute,sizeof (audioRouteOverride),&audioRouteOverride);

Надеюсь, это не слишком большое отступление. Я просто подумал, что это будет хорошо для тех, кому просто нужны эти два маленьких заявления.

2 голосов
/ 23 апреля 2010

Я использовал каркас AudioToolbox, поэтому я инициализировал мой аудио сеанс следующим образом:

AudioSessionInitialize(NULL, NULL, NULL, NULL);

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

UInt32 sessionCategory = kAudioSessionCategory_MediaPlayback;
OSStatus err = AudioSessionSetProperty(kAudioSessionProperty_AudioCategory,
                                       sizeof(sessionCategory),
                                       &sessionCategory);
AudioSessionSetActive(TRUE);
if (err) {
    NSLog(@"AudioSessionSetProperty kAudioSessionProperty_AudioCategory failed: %d", err);
}
1 голос
/ 17 февраля 2016

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

Лучше использовать AVAudioSessionCategoryOption (что за глоток) DefaultToSpeaker. Документация для этого гласит (выделено мое):

При использовании этой опции и при отсутствии других аудио маршрутов (например, гарнитуры) звук сеанса будет воспроизводиться через встроенный динамик устройства . Если этот параметр не используется , а другой аудиовыход недоступен или не выбран, звук будет воспроизводиться через ресивер (динамик, предназначенный для удержания в ухе). Обратите внимание, что только устройства iPhone оснащены приемником; на устройствах iPad и iPod touch этот параметр не действует.

Чтобы использовать это, измените ваш звонок на setCategory:, чтобы передать опцию, например так:

let session = AVAudioSession.sharedInstance()
try session.setCategory(AVAudioSessionCategoryPlayAndRecord, withOptions: [.DefaultToSpeaker])
1 голос
/ 25 апреля 2010

Ваш код для воспроизведения звука выглядит правильно, и нет никаких причин, по которым вам следует использовать AudioToolbox. Вы можете убедиться в том, что используете поддерживаемые аудиоформаты. (Лично я имел успех с MP3 и WAV)

Кроме того, не могли бы вы поделиться с нами своим кодом относительно того, как вы получаете URL для вашего звукового файла?

0 голосов
/ 25 ноября 2015

Попробуйте это:

NSError *error;
AVAudioSession *audioSession = [AVAudioSession sharedInstance];
[audioSession overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:&error];    
if(error) { 
    NSLog(@"STKAudioManager: AudioSession cannot use speakers");
}
...