牛奶味的榴莲 2019-09-19 16:01 采纳率: 0%
浏览 1693
已结题

freeswitch对话分段录音问题

问题描述:
使用X-Litet通过freeSwitch中的ESL对用户1000进行语音呼叫,在1000接通后播放预先设定的录音。
此时有两个地方小弟不明白:
1.1000分机接听后 通过什么事件得知1000正在说话的状态?
2.如何在1000分机说话的时候开始录音,1000分机停止说话的时候终止录音?

        相关测试代码:
            1.SpringBoot
                2.ESL-Java
package iven.FreeSwitch.bean;

import org.freeswitch.esl.client.IEslEventListener;
import org.freeswitch.esl.client.inbound.Client;
import org.freeswitch.esl.client.inbound.InboundConnectionFailure;
import org.freeswitch.esl.client.transport.event.EslEvent;
import org.freeswitch.esl.client.transport.message.EslMessage;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.Serializable;
import java.text.SimpleDateFormat;
import java.util.Date;

public class EventEslInboundTest implements Serializable {
    private static final Logger log  = LoggerFactory.getLogger(EventEslInboundTest.class);
    private static String host = "192.168.108.193";
    private static int    port = 8021;
    private static String password = "ClueCon";

    private static  Client client = null;
    private static boolean bConnected = false;
    private static EventEslInboundTest eventEslInboundTest = null;
    private static SimpleDateFormat formatter = new SimpleDateFormat("dd-MMM-yyyy HH:mm:ss:SSS");
    public static void  ConsoleLog(String strInfo){

        System.out.println( formatter.format(new Date(System.currentTimeMillis()))+"["+strInfo+"]" );
    }

    public static EventEslInboundTest getInstance( ) {
         if(eventEslInboundTest == null)
         {
             eventEslInboundTest = new EventEslInboundTest();
         }
         return eventEslInboundTest;
    }

    private static void initSocket(){

        if( client==null ) {
            client = new Client();
        }
        if( bConnected )
            return ;
        try
        {
            client.connect( host, port, password, 10 );
             bConnected = true;
        }
        catch ( InboundConnectionFailure e )
        {
            log.error("Connect failed",e);
            return;
        }
    }
    public static void inBand()
    {
        initSocket();
        System.out.println("event_socket_test".toUpperCase());
        client.setEventSubscriptions("plain", "ALL");//"all"

        //注册事件处理程序
        client.addEventListener( new IEslEventListener()
         {
            public void eventReceived( EslEvent event )
            {
                if(event.getEventName().equals("CHANNEL_ANSWER")){
                    String callId = event.getEventHeaders().get("variable_uuid");
                    ConsoleLog("["+callId+"]"+"CHANNEL_ANSWER:"+event.getEventBodyLines().toString());

                    String param = callId + " playback::" + "1.wav" + " both";
                    EslMessage result = client.sendSyncApiCommand("uuid_broadcast", param);
                    ConsoleLog("uuidBroadcastNuance result " + result.toString());

                }
                if(event.getEventName().equals("CHANNEL_EXECUTE_COMPLETE")) {
                    String callId = event.getEventHeaders().get("variable_uuid");
                    ConsoleLog("["+callId+"]"+"CHANNEL_EXECUTE_COMPLETE");
                }
                if (event.getEventName().equals("CHANNEL_PARK")) {
                    String callId = event.getEventHeaders().get("variable_uuid");
                    ConsoleLog("["+callId+"]"+"CHANNEL_PARK");

                    String param = callId + " playback::" + "2.wav" + " both";
                    String result = client.sendAsyncApiCommand("uuid_broadcast", param);
                    ConsoleLog("uuidBroadcastNuance result " + result);
                }

                if(event.getEventName().equals("HEARTBEAT")){
                    String callId = event.getEventHeaders().get("variable_uuid");
                    //System.out.println("recieved Hearbeat event !" + event.getEventBodyLines());
                }
                if(event.getEventName().equals("CHANNEL_DESTROY")){
                    String callId = event.getEventHeaders().get("variable_uuid");
                    ConsoleLog("["+callId+"]"+"CHANNEL_DESTROY");

                    client.close( );
                    client = null;
                    bConnected = false;
                }
                if(event.getEventName().equals("CHANNEL_HANGUP_COMPLETE")){
                    //挂断
                    String callId = event.getEventHeaders().get("variable_uuid");
                    ConsoleLog("["+callId+"]"+"CHANNEL_HANGUP_COMPLETE");

//                    client.sendSyncApiCommand( "uuid_record ",callId+" stop record::333.wav" );
//                    ConsoleLog("["+callId+"]"+"uuid_record  stop record 333.wav");
                }
                if (event.getEventName().equals("DETECTED_SPEECH")) {
                    String callId = event.getEventHeaders().get("variable_uuid");
                    ConsoleLog("["+callId+"]"+"DETECTED_SPEECH");
                    String asrStatus = (String) event.getEventHeaders().get("Speech-Type");
                    ConsoleLog("["+callId+"]"+asrStatus);
                }

                if(event.getEventName().equals("CHANNEL_EXECUTE_PBX"))
                {
                    ConsoleLog("CHANNEL_EXECUTE_PBX");
                }
                if(event.getEventName().equals("CHANNEL_BRIDGE"))
                {
                    ConsoleLog("CHANNEL_BRIDGE");
                }
                if(event.getEventName().equals("CHANNEL_APPLICATION"))
                {
                    ConsoleLog("CHANNEL_APPLICATION");
                }
                if(event.getEventName().equals("CHANNEL_HOLD"))
                {
                    ConsoleLog("CHANNEL_HOLD");
                }
                if(event.getEventName().equals("CHANNEL_STATE"))
                {
                    ConsoleLog("CHANNEL_STATE:" + event.getEventHeaders().get("Channel-State"));
                }
                if(event.getEventName().equals("CHANNEL_CALLSTATE"))
                {
                    ConsoleLog("CHANNEL_CALLSTATE:" + event.getEventHeaders().get("Channel-Call-State"));
                }
                if(event.getEventName().equals("CALL_UPDATE"))
                {
                    ConsoleLog("CALL_UPDATE");
                }

                if(event.getEventName().equals("CUSTOM"))
                {
                    ConsoleLog("收到:"+"CUSTOM ="+event.getEventBodyLines().toString());
                }
            }
            public void backgroundJobResultReceived( EslEvent event )
            {
                String uuid= event.getEventHeaders().get("Job-UUID");
                //log.info("Background job result received+:"+event.getEventName()+"/"+event.getEventHeaders());// +"/"+JoinString(event.getEventHeaders())+"/"+JoinString(event.getEventBodyLines()));
                ConsoleLog("Background job result received+:"+event.getEventName()+"/"+event.getEventHeaders());// +"/"+JoinString(event.getEventHeaders())+"/"+JoinString(event.getEventBodyLines()));
            }
     });


    }

    public static void dialPhone( String mobile )  {

        //初始化FreeSwitch socket对象
        initSocket();
        //注册事件
        inBand();
        //呼叫接通后播放语音
        //client.sendAsyncApiCommand("originate", "{ignore_early_media=true}user/1004 &playback(1.wav) ");
        client.sendAsyncApiCommand("originate", "user/1004  &hold()"); //&echo() &park()

        log.debug("client.sendAsyncApiCommand");

        //1000接通后将1000转接到1002
        //EslMessage response = client.sendSyncApiCommand("originate", "user/1000  &bridge(user/1003)  default zhang");
        //System.out.println("body_string"+response.toString());

    }
}

头发都要掉光了,请大神解答。

  • 写回答

1条回答 默认 最新

  • dabocaiqq 2019-09-19 17:14
    关注
    评论

报告相同问题?