iOS錄音後播放聲音小,AudioSessionInitialize failed,AudioQueueStart failed (-50)

來源:互聯網
上載者:User

標籤:

方法1:
UInt32 audioRoute = kAudioSessionOverrideAudioRoute_Speaker;AudioSessionSetProperty(kAudioSessionProperty_OverrideAudioRoute, sizeof(audioRoute), &audioRoute);

 

方法2:
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];

 

 解決AudioSessionInitialize fail 用( dispatch_once_t)解決AudioQueueStart failed (-50)
AudioSessionInitialize可以被多次執行,但AudioSessionInterruptionListener只能被設定一次,這就意味著這個打斷回調方法是一個靜態方法,一旦初始化成功以後所有的打斷都會回調到這個方法,即便下一次再次調用AudioSessionInitialize並且把另一個靜態方法作為參數傳入,當打斷到來時還是會回調到第一次設定的方法上。 這種情境並不少見,例如你的app既需要播放歌曲又需要錄音,當然你不可能知道使用者會先調用哪個功能,所以你必須在播放和錄音的模組中都調用AudioSessionInitialize註冊打斷方法,但最終打斷回調只會作用在先註冊的那個模組中,很蛋疼吧。。。所以對於AudioSession的使用最好的方法是產生一個類單獨進行管理,統一接收打斷回調並發送自訂的打斷通知,在需要用到AudioSession的模組中接收通知並做相應的操作。摘自:http://www.cocoachina.com/industry/20140717/9162.html
static dispatch_once_t onceToken;    __block OSStatus error ;    dispatch_once(&onceToken, ^{                 error = AudioSessionInitialize(NULL, NULL, nil, (__bridge void*) self);        if (error) printf("ERROR INITIALIZING AUDIO SESSION! %d\n", (int)error);        else        {            UInt32 category = kAudioSessionCategory_PlayAndRecord;             error = AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(category), &category);                         AudioSessionSetActive(true);                         if (error) printf("couldn‘t set audio category!");                         error = AudioSessionAddPropertyListener(kAudioSessionProperty_AudioRouteChange, propListener,(__bridge void*) self);            if (error) printf("ERROR ADDING AUDIO SESSION PROP LISTENER! %d\n", (int)error);            UInt32 inputAvailable = 0;            UInt32 size = sizeof(inputAvailable);                         // we do not want to allow recording if input is not available            error = AudioSessionGetProperty(kAudioSessionProperty_AudioInputAvailable, &size, &inputAvailable);            if (error) printf("ERROR GETTING INPUT AVAILABILITY! %d\n", (int)error);                                      // we also need to listen to see if input availability changes            error = AudioSessionAddPropertyListener(kAudioSessionProperty_AudioInputAvailable, propListener, (__bridge void*)self);            if (error) printf("ERROR ADDING AUDIO SESSION PROP LISTENER! %d\n", (int)error);                         error = AudioSessionSetActive(true);            if (error) printf("AudioSessionSetActive (true) failed");                         UInt32 audioRoute = kAudioSessionOverrideAudioRoute_Speaker;            error = AudioSessionSetProperty(kAudioSessionProperty_OverrideAudioRoute, sizeof(audioRoute), &audioRoute);            if (error) printf("AudioSessionSetProperty (AudioRoute_Speaker) failed");        }             });

 

  

iOS錄音後播放聲音小,AudioSessionInitialize failed,AudioQueueStart failed (-50)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.