AVAudioPlayer通过扬声器

时间:2010-04-18 02:12:30

标签: iphone avaudioplayer speaker

我收到了以下代码:

- (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 个答案:

答案 0 :(得分: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

答案 1 :(得分:4)

对于iOS7,不推荐使用AudioSessionSetProperty。以下帖子中代工厂的答案显示了如何为iOS7做到这一点:

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

答案 2 :(得分: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");
    }
}

答案 3 :(得分: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);
}

答案 4 :(得分:2)

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

我一直在寻找这个问题的答案,特别是SpeakHere的例子。我抓住了这一小块代码然后就可以了。

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

我希望这不是一个题外话。我只是觉得那些只需要这两个小陈述的人会好的。

答案 5 :(得分:1)

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

另外,您可以与我们分享您的代码,了解如何获取声音文件的网址吗?

答案 6 :(得分:1)

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

应该使用AVAudioSessionCategoryOption(满口)DefaultToSpeaker。该文件的读物(强调我的):

  

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

要使用此功能,请将您的呼叫更改为setCategory:以通过该选项,如下所示:

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

答案 7 :(得分:0)

试试这个:

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