代码之家  ›  专栏  ›  技术社区  ›  Mark

通过扬声器的Avaudioplayer

  •  5
  • Mark  · 技术社区  · 16 年前

    我得到了以下代码:

    - (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 回复  |  直到 9 年前
        1
  •  2
  •   stigi    16 年前

    我使用了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);
    }
    
        2
  •  4
  •   jocull    13 年前

    你的设置很挑剔…

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

        3
  •  4
  •   Community Mohan Dere    9 年前

    对于ios7,audiosessionsetproperty已弃用。Foundry在下面的帖子中给出的答案显示了如何为ios7执行此操作:

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

        4
  •  3
  •   P.J.Radadiya Yevgen THD    9 年前

    很好的例子 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");
        }
    }
    
        5
  •  2
  •   Eric Brotto    15 年前

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

    我在寻找这个问题的答案,特别是speakhere示例。我抓起这段代码就成功了。

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

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

        6
  •  1
  •   strange quark    16 年前

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

    另外,你能和我们分享你的代码,你如何得到你的声音文件的网址?

        7
  •  1
  •   Ahti    10 年前

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

    人们更应该使用 AVAudioSessionCategoryOption (真是一口) DefaultToSpeaker . 文件内容如下(重点是我的):

    使用此选项时 而且没有其他音频线路(如耳机)可用,会话 音频将通过设备的内置扬声器播放 . 不使用此选项时 ,并且没有其他音频输出可用或选定, 音频将通过接收器播放 (一个要紧靠耳朵的演讲者)。请注意,只有iphone设备配备了接收器;在ipad和ipod touch设备上,此选项无效。

    用这个,把你的电话改成 setCategory: 要传递选项,如下所示:

    let session = AVAudioSession.sharedInstance()
    try session.setCategory(AVAudioSessionCategoryPlayAndRecord, withOptions: [.DefaultToSpeaker])
    
        8
  •  0
  •   Yunus Nedim Mehel    10 年前

    试试这个:

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