2010-04-18 2 views
5

Я получил следующий код:AVAudioPlayer через колонку

- (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]; 
+1

Ваш код выглядит правильно для меня (я используя совершенно то же самое и работает). возможно, просто проверьте, что ошибка не возвращается, а не передает ноль. Ошибка NSError *; [[AVAudioSession sharedInstance] setActive: ДА error: & error]; чтобы убедиться, что ваш сеанс аудио в порядке. – yonel

ответ

2

Я использовал рамку 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); 
} 
+0

Как это использовать в IOS8? – Anoop

+0

Кристина добавила ответ, что хорошо работает в iOS 7+ –

1

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

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

2

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

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

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

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

4

Это разборчивы о том, как вы установите его ...

[[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

Очень хороший пример здесь 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"); 
    } 
} 
0

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

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

ОШИБКА: AVAudioSessionUtilities.mm:105: getUInt32: - Преобразователь значения категории не смог найти соответствие для строки «Receiver» plz solution this problem. –

+0

Извините, я не знаю, как решить вашу проблему @ P.J.Radadiya –

+0

Спасибо @Yunus Nedim Mehel –

1

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

Нужно использовать AVAudioSessionCategoryOption (какой глоток) DefaultToSpeaker. В документации, которая читает (курсив мой):

When using this option and no other audio route (such as a headset) is available, session audio will play through the device’s built-in speaker. When not using this option, and no other audio output is available or selected, audio will play through the receiver (a speaker intended to be held to the ear). Note that only iPhone devices are equipped with a receiver; on iPad and iPod touch devices, this option has no effect.

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

let session = AVAudioSession.sharedInstance() 
try session.setCategory(AVAudioSessionCategoryPlayAndRecord, withOptions: [.DefaultToSpeaker]) 
Смежные вопросы