【问题标题】:AVAudioPlayer via SpeakersAVAudioPlayer 通过扬声器
【发布时间】:2011-02-09 06:57:51
【问题描述】:

我得到以下代码:

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

【问题讨论】:

  • 您的代码对我来说看起来是正确的(我使用的完全一样,并且可以正常工作)。也许只是检查没有错误返回而不是传递零。 NSError* 错误; [[AVAudioSession sharedInstance] setActive:YES error:&error];以确保您的音频会话正常。

标签: iphone avaudioplayer speaker


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案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");
          }
      }
      

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 如何在IOS8中使用这个?
        【解决方案5】:

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

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

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

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

        【讨论】:

          【解决方案6】:

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

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

          【讨论】:

            【解决方案7】:

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

            人们宁愿使用AVAudioSessionCategoryOption(多嘴)DefaultToSpeaker。该文件的内容为(强调我的):

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

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

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

            【讨论】:

              【解决方案8】:

              试试这个:

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

              【讨论】:

              • ERROR: AVAudioSessionUtilities.mm:105: getUInt32: -- Category Value Converter 未能找到字符串“Receiver”的匹配项,请解决此问题。
              • 抱歉,我不知道您的问题的解决方案@P.J.Radadiya
              • 感谢@Yunus Nedim Mehel
              猜你喜欢
              • 1970-01-01
              • 2010-11-04
              • 1970-01-01
              • 2016-07-18
              • 1970-01-01
              • 1970-01-01
              • 2023-04-02
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多