Iphone AVAudioPlayer通过扬声器播放

Iphone AVAudioPlayer通过扬声器播放,iphone,avaudioplayer,speaker,Iphone,Avaudioplayer,Speaker,我得到了以下代码: - (id)init { if (self = [super init]) { UInt32 sessionCategory = kAudioSessionCategory_MediaPlayback; AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(sessionCategory), &sessionCategory);

我得到了以下代码:

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

我使用了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);
}

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


另外,你可以和我们分享你的代码,你如何得到你的声音文件的url

我只想向这篇文章的其他读者澄清这一点

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

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

我希望这不是太离题。我只是觉得这对那些只需要这两个小声明的人来说是件好事

它对你的设置很挑剔

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error:nil];
UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker;
AudioSessionSetProperty(kAudioSessionProperty_OverrideAudioRoute, sizeof(audioRouteOverride), &audioRouteOverride);
使用
音频会话类别播放和记录非常重要,否则该路径将无法到达扬声器。设置音频会话的覆盖路由后,可以使用
AVAudioPlayer
实例向扬声器发送一些输出

希望其他人也能像我一样。关于这一点的文档是分散的,但Skype应用程序证明了这是可能的。坚持下去,我的朋友们!:)

以下是一些Apple文档:


在页面上搜索
kAudioSessionProperty\u OverrideAudioRoute

以查找iOS7 AudioSessionSetProperty已弃用。foundry在以下帖子中给出的答案显示了如何为iOS7做到这一点:

这里的一个很好的例子解决了我的问题

下面的方法-配置音频会话-将音频重新路由到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");
    }
}
试试这个:

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

虽然其他答案确实提供了在扬声器而不是接收器上播放音频的理想效果,但它们并不是实现这一目标的惯用方法

我们应该使用
AVAudioSessionCategoryOption
(真是太多了)
DefaultToSpeaker
。该文件内容如下(重点):

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

要使用此选项,请将调用更改为
setCategory:
以传递该选项,如下所示:

let session = AVAudioSession.sharedInstance()
try session.setCategory(AVAudioSessionCategoryPlayAndRecord, withOptions: [.DefaultToSpeaker])

在我看来,您的代码是正确的(我使用的是完全相同的代码,它可以正常工作)。可能只是检查没有返回错误,而不是传递nil。n错误*错误;[[AVAudioSession sharedInstance]设置活动:是错误:&错误];以确保您的音频会话正常。如何在IOS8中使用此功能?错误:AVAudioSessionUtilities.mm:105:getUInt32:--类别值转换器未能找到字符串“Receiver”的匹配项。请解决此问题。抱歉,我不知道您的问题的解决方案@P.J.RadadiyaThanks@Yunus Nedim Mehel