freeswitchESL开发日志1

freeswitchESL开发日志1

补振铃音和检测语音流

为了完善补振铃逻辑,需要对语音流进行检验,首先根据线程操作进行跟踪,发现freeswitch在不同的状态下用不同的函数进行收包操作。
在收包函数switch_core_session_read_frame中进行修改,在收包结束时进行检测收包内容如果为SFF_CNG(舒适噪音包)则判定收包失败,100次收包失败则认为无语音流,上报自定义事件(注意:协商为13或者设置通道静音会导致收到的所有包都是SFF_CNG)。
收到第一个正常包上报语音恢复事件。

参考链接

链接: link.

.

	SWITCH_DECLARE(switch_status_t) switch_core_session_read_frame(switch_core_session_t *session, switch_frame_t **frame, switch_io_flag_t flags,int stream_id)
{
	........................
	 even_more_done:

    if (!*frame ||
            (!switch_test_flag(*frame, SFF_PROXY_PACKET) &&
             (!(*frame)->codec || !(*frame)->codec->implementation || !switch_core_codec_ready((*frame)->codec)))) {
        *frame = &runtime.dummy_cng_frame;
    }
    if(!*frame || switch_test_flag(*frame, SFF_CNG)){
        if(switch_channel_get_callstate(session->channel) == CCS_EARLY && 0 == switch_channel_get_first_rtp_event(session->channel)){
            if(switch_channel_get_no_rtp_count(session->channel) == 0){
                switch_event_t* event;
                if(switch_event_create_subclass(&event,SWITCH_EVENT_CUSTOM,"ccod::nortp") == SWITCH_STATUS_SUCCESS)
                {
                    switch_channel_event_set_data(session->channel,event);
                    switch_event_fire(&event);
                }
                switch_channel_set_no_rtp_once(session->channel);
            }else if(switch_channel_get_no_rtp_count(session->channel) > 0){
                switch_channel_set_no_rtp_once(session->channel);
            }
        }
	}else if(switch_channel_get_callstate(session->channel) == CCS_EARLY && 0 == switch_channel_get_first_rtp_event(session->channel)){
        switch_event_t* event;
        switch_channel_set_first_rtp_event(session->channel);
        if(switch_event_create_subclass(&event,SWITCH_EVENT_CUSTOM,"ccod::firstrtp") == SWITCH_STATUS_SUCCESS)
        {
            switch_channel_event_set_data(session->channel,event);
            switch_event_fire(&event);
        }
    }

    switch_mutex_unlock(session->read_codec->mutex);
    switch_mutex_unlock(session->codec_read_mutex);


    if (status == SWITCH_STATUS_SUCCESS && switch_channel_get_callstate(session->channel) == CCS_UNHELD) {
        switch_channel_set_callstate(session->channel, CCS_ACTIVE);
    }


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值