• 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
    ", (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
    ", (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
    ", (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
    ", (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");
            }
             
        });
    
     
     
  • 相关阅读:
    JavaScript的正则表达式的基础
    运用JS判断代码可以参考学习
    调用百度地图代码
    运用了css,js
    中国地图(Highmaps)
    Centos
    代理模式【 动态代理与静态代理】
    java集合 collection-list-LinkedList 模拟一个堆栈或者队列数据结构。
    java集合 collection-list-LinkedList
    java集合 collection-list-vector
  • 原文地址:https://www.cnblogs.com/damiao/p/4521225.html
Copyright © 2020-2023  润新知