2011-04-14 133 views
13

我試着用AVAudioSessionAVAudioPlayer分別錄製和播放聲音,但音量很低。如何在iPhone應用程序中錄製和播放聲音?

我試圖把AVAudioPlayer的體積值增加到1.0以上,但沒有多大幫助。

我可以用其他方法錄製可以大聲回放的聲音嗎?

+0

您使用的是內置麥克風,或者說是在標準耳塞線話筒?聲音與麥克風的距離有多近?如果您記錄-peakPowerForChannel,您會看到什麼樣的值? – NSResponder 2011-04-14 11:14:24

+0

@NSResponder:我正在使用內置麥克風。你也可以解釋如何登錄-peakPowerForChannel? – 2011-04-14 11:16:11

回答

25

此代碼應該是對您有用:

#import <AudioToolbox/AudioServices.h> 

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

這將增大音量。代碼的功能是將iPhone上的普通聲音轉換爲揚聲器聲音。這就是使用kAudioSessionOverrideAudioRoute_Speaker的原因。

+0

感謝您的輸入。我會檢查出來,並儘快回覆給你:) – 2011-04-14 13:01:49

+0

非常感謝,這確實有用:)自從現在開始,我一直在尋找解決方案。 – 2011-04-14 13:26:12

+3

不要忘記導入聲明。對於更有經驗的程序員來說也許是顯而易見的...... #import MaKo 2011-09-15 05:20:57

1

下面的代碼修復了這個問題對我來說:

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error: nil]; 
[[AVAudioSession sharedInstance] setActive: YES error: nil]; 
UInt32 doChangeDefault = 1; 
AudioSessionSetProperty(kAudioSessionProperty_OverrideCategoryDefaultToSpeaker, sizeof(doChangeDefault), &doChangeDefault); 
23

由於iOS7可以直接解決這一問題AVAudioSession

的overrideOutputAudioPort方法確實比AudioSessionSetProperty

NSError *setOverrideError; 
NSError *setCategoryError; 

AVAudioSession *session = [AVAudioSession sharedInstance]; 
[session setCategory:AVAudioSessionCategoryPlayAndRecord error:&setCategoryError]; 

if(setCategoryError){ 
    NSLog(@"%@", [setCategoryError description]); 
} 

[session overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:&setOverrideError]; 


if(setOverrideError){ 
    NSLog(@"%@", [setOverrideError description]); 
} 
+0

這行保存了我的生活,謝謝 [session overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:&setOverrideError]; – 2017-08-16 08:40:20

0

MAN相同, 嘗試這個。

AVAudioSession *session = [AVAudioSession sharedInstance]; 

NSError *setCategoryError = nil; 
if (![session setCategory:AVAudioSessionCategoryPlayback 
       withOptions:kAudioSessionOverrideAudioRoute_Speaker 
        error:&setCategoryError]) { 
     // handle error 
} 

NSError *error; 
NSData * data = [NSData dataWithContentsOfURL:self.playlet.urlSound]; 

self.audioPlayer = [[AVAudioPlayer alloc] initWithData:data fileTypeHint:@"aac" error:&error]; 

self.audioPlayer.delegate = self; 

if (error) 
    NSLog(@"Error: %@", 
      [error localizedDescription]); 
else 
    [_audioPlayer play]; 
0

只是設置此 [會話overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker錯誤:& setOverrideError]; 它適合我。

4

斯威夫特版本:

import AVFoundation 
var overrideError : NSError? 
    if AVAudioSession.sharedInstance().overrideOutputAudioPort(.Speaker, error: &error){ 

    }else{ 
     print("error in overrideOutputAudioPort " + overrideError!.localizedDescription) 
    } 

斯威夫特2:

 do { 
     try AVAudioSession.sharedInstance().overrideOutputAudioPort(AVAudioSessionPortOverride.Speaker) 
     } catch { 
     } 
+0

隨着Swift 2,這現在是一個嘗試捕捉的情況下,不需要覆蓋錯誤可選 – blwinters 2015-11-02 02:00:00

+0

thnx,我編輯答案 – 2015-11-02 07:15:11

相關問題