5

我得到以下代码:

- (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];
4

8 回答 8

4

对于 iOS7 AudioSessionSetProperty 已弃用。Foundry 在以下帖子中的答案显示了如何为 iOS7 执行此操作:

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

于 2013-11-01T22:08:20.793 回答
4

你如何设置它很挑剔......

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

使用非常重要,AVAudioSessionCategoryPlayAndRecord否则路由将无法到达扬声器。为音频会话设置覆盖路由后,您可以使用AVAudioPlayer实例并将一些输出发送到扬声器。

希望对别人有用,就像对我一样。这方面的文档很分散,但 Skype 应用程序证明这是可能的。坚持下去,我的朋友们!:)

这里有一些苹果文档:http: //developer.apple.com/library/ios/#documentation/AudioToolbox/Reference/AudioSessionServicesReference/Reference/reference.html

在页面上搜索kAudioSessionProperty_OverrideAudioRoute

于 2013-05-28T02:48:49.970 回答
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");
    }
}
于 2015-05-14T08:02:14.937 回答
2

我只是要为这篇文章的其他读者澄清这一点。

我一直在寻找这个问题的答案,特别是 SpeakHere 示例。我抓住了一小段代码,它成功了。

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

我希望这不是题外话。我只是认为这对那些只需要这两个小语句的人来说会很好。

于 2011-02-20T16:25:20.267 回答
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);
}
于 2010-04-23T12:12:18.470 回答
1

您播放声音的代码看起来是正确的,您没有理由必须使用 AudioToolbox。您可能要确保的一件事是您使用的是受支持的音频格式。(我个人在 MP3 和 WAV 方面取得了成功)

另外,您能否与我们分享您的代码,了解如何获取声音文件的 url?

于 2010-04-24T22:44:08.590 回答
1

虽然其他答案确实提供了在扬声器而不是接收器上播放音频的预期效果,但它们并不是实现该目标的惯用方式。

一个人应该使用AVAudioSessionCategoryOption(what a 一口) DefaultToSpeaker。该文件的内容为(强调我的):

当使用此选项且没有其他音频路由(如耳机)可用时,会话音频将通过设备的内置扬声器播放如果不使用此选项,并且没有其他音频输出可用或未选择,音频将通过接收器(旨在贴在耳朵上的扬声器)播放。请注意,只有 iPhone 设备配备接收器;在 iPad 和 iPod touch 设备上,此选项无效。

要使用它,请将您的调用更改setCategory:为传递选项,如下所示:

let session = AVAudioSession.sharedInstance()
try session.setCategory(AVAudioSessionCategoryPlayAndRecord, withOptions: [.DefaultToSpeaker])
于 2016-02-17T05:31:58.857 回答
0

尝试这个:

NSError *error;
AVAudioSession *audioSession = [AVAudioSession sharedInstance];
[audioSession overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:&error];    
if(error) { 
    NSLog(@"STKAudioManager: AudioSession cannot use speakers");
}
于 2015-11-25T15:41:17.307 回答