iOS录音后播放声音小,AudioSessionInitialize failed,AudioQueueStart failed (-50)

方法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");
        }
         
    });

 

 
 

转载于:https://www.cnblogs.com/damiao/p/4521225.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值