freeswitch在Bypass媒体下为什么修改了200中的SDP,没有透传?

基于freeswitch和Boghe IMS/RCS client搭建了一个Voip环境,想让媒体基于P2P方式,所以将freeswitch设置成了无媒体方式(internal.xml中的inbound-bypass-media设置为true,default.xml中增加bypass_meidia=true), 实际测试过程中发现被叫应答的时候200中的SDP freeswitch没有透传到主叫侧(被叫没发183),freeswitch将SDP中的Media description给改了,导致主被叫媒体不通。请各位大神帮忙看下具体是什么问题,多谢。

被叫发过来的200中的SDP:
v=0
o=doubango 1983 678901 IN IP4 10.61.42.135
s=-
c=IN IP4 10.61.42.135
t=0 0
m=audio 6738 RTP/AVPF 8 101
a=ptime:20
a=silenceSupp:off - - - -
a=rtpmap:8 PCMA/8000/1
a=rtpmap:101 telephone-event/8000/1
a=fmtp:101 0-16
a=acfg:1 t=1
a=sendrecv
a=rtcp-mux
a=ssrc:4189294891 cname:ldjWoB60jbyQlR6e
a=ssrc:4189294891 mslabel:6994f7d1-6ce9-4fbd-acfd-84e5131ca2e2
a=ssrc:4189294891 label:Doubango.Audio

freeswitch发送给主叫侧的200消息中的SDP:
v=0
o=doubango 1983 678901 IN IP4 10.61.42.135
s=-
c=IN IP4 10.61.42.135
t=0 0
m=audio 0 RTP/AVP 19

1个回答

weixin_42995058
syhgwangy 多谢。我就是使用了第三种方式(Bypass媒体方式),但FS修改了200中的SDP,这种方式下FS不应该修改的,应该透传,不知道是怎么回事。Invite消息中的SDP FS没有修改
一年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
freeswitch中数据传输问题
近期在研究关于freeswitch的东西,遇到一个麻烦,想在源代码中想要查看rtp传输时所涉及到的函数流程,由于本人完全新手,一直没有头绪,希望能得到大侠的指点,谢谢!
Java如何调用FreeSwitch接口
Java 调用FreeSwitch 其中的esl.jar是怎么生成的了 System.load("/lib64/fs/libesljni.so");这又是怎么回事
关于 freeSwitch 的端口转发问题?
![如图](https://img-ask.csdn.net/upload/201709/12/1505212387_631218.png) 在这样的环境下,FreeSwitch需要如何配置?
FreeSWITCH如何支持323终端注册
如题,我在编译好的FreeSWITCH中,想要让第三方支持GK注册的终端能够注册到freeSWITCH上,就像是SIP终端注册到FreeSWITCH上一样,我在FreeSWITCH中已经将mod_h323模块编译完成,希望大神指教一下,怎么样才能让323终端支持注册到FreeSWITCH上
64位win7操作系统,安装freeswitch后启动报错,求解决方法
Cannot open pid file C:/Program Files/FreeSWITCH/run/freeswitch.pid.
freeswitch callcenter无法打通分机
freeswitch callcenter无法打通分机,calcenter号码设置为了7000,通过voip打到7000,有响铃,但是无法通过配置的规则打到1001或者1002分机。下面是我的配置文件: ![图片说明](https://img-ask.csdn.net/upload/201908/29/1567073009_744136.png)![图片说明](https://img-ask.csdn.net/upload/201908/29/1567073021_624763.png) ,call_center的module也安装了,求大佬解答
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()); } } ``` 头发都要掉光了,请大神解答。
freeswitch对接mod_unimrcp进行ASR语音识别时,unimrcp服务器一直显示检测中,但检测不到语音?
2019-07-11 10:41:10:706791 [INFO] Receive SIP Event [nua_i_invite] Status 100 Trying [SIP-Agent-1] 2019-07-11 10:41:10:706842 [INFO] Receive SIP Event [nua_i_state] Status 100 Trying [SIP-Agent-1] 2019-07-11 10:41:10:706848 [NOTICE] SIP Call State [received] 2019-07-11 10:41:10:706880 [INFO] Create Session 0x7f3bf4004728 <new> [uni2] 2019-07-11 10:41:10:706905 [INFO] Remote SDP 0x7f3bf4004728 <new> v=0 o=FreeSWITCH 7957069661587620113 7436270796488759771 IN IP4 172.17.1.116 s=- c=IN IP4 172.17.1.116 t=0 0 m=application 9 TCP/MRCPv2 1 a=setup:active a=connection:new a=resource:speechrecog a=cmid:1 m=audio 4002 RTP/AVP 0 8 96 a=rtpmap:0 PCMU/8000 a=rtpmap:8 PCMA/8000 a=rtpmap:96 L16/8000 a=sendonly a=mid:1 2019-07-11 10:41:10:706939 [NOTICE] Add Session <579805baa38511e9> 2019-07-11 10:41:10:706943 [INFO] Receive Offer 0x7f3bf4004728 <579805baa38511e9> [c:1 a:1 v:0] 2019-07-11 10:41:10:707015 [INFO] Add Pending Control Channel <579805baa38511e9@speechrecog> [1] 2019-07-11 10:41:10:716519 [INFO] Enable RTP Session 172.17.2.196:5002 2019-07-11 10:41:10:716594 [INFO] Open RTP Receiver 172.17.2.196:5002 <- 172.17.1.116:4002 playout [50 ms] bounds [0 - 600 ms] adaptive [1] skew detection [1] 2019-07-11 10:41:10:716604 [INFO] Media Path 0x7f3bf4004728 Source->[PCMU/8000/1]->Decoder->[LPCM/8000/1]->Bridge->[LPCM/8000/1]->Sink 2019-07-11 10:41:10:716652 [INFO] Send Answer 0x7f3bf4004728 <579805baa38511e9> [c:1 a:1 v:0] Status OK 2019-07-11 10:41:10:716663 [INFO] Local SDP 0x7f3bf4004728 <579805baa38511e9> v=0 o=UniMRCPServer 0 0 IN IP4 172.17.2.196 s=- c=IN IP4 172.17.2.196 t=0 0 m=application 1544 TCP/MRCPv2 1 a=setup:passive a=connection:new a=channel:579805baa38511e9@speechrecog a=cmid:1 m=audio 5002 RTP/AVP 0 a=rtpmap:0 PCMU/8000 a=recvonly a=mid:1 2019-07-11 10:41:10:717118 [INFO] Receive SIP Event [nua_i_state] Status 200 OK [SIP-Agent-1] 2019-07-11 10:41:10:717159 [NOTICE] SIP Call State 0x7f3bf4004728 [completed] 2019-07-11 10:41:10:718486 [NOTICE] Accepted TCP/MRCPv2 Connection 172.17.2.196:1544 <-> 172.17.1.116:52216 2019-07-11 10:41:10:718523 [INFO] Receive SIP Event [nua_i_ack] Status 200 OK [SIP-Agent-1] 2019-07-11 10:41:10:718529 [INFO] Receive SIP Event [nua_i_state] Status 200 OK [SIP-Agent-1] 2019-07-11 10:41:10:718533 [NOTICE] SIP Call State 0x7f3bf4004728 [ready] 2019-07-11 10:41:10:718535 [INFO] Receive SIP Event [nua_i_active] Status 200 Call active [SIP-Agent-1] 2019-07-11 10:41:10:726777 [INFO] Receive MRCPv2 Data 172.17.2.196:1544 <-> 172.17.1.116:52216 [468 bytes] MRCP/2.0 468 DEFINE-GRAMMAR 1 Channel-Identifier: 579805baa38511e9@speechrecog Content-Type: application/srgs+xml Content-Id: 5ce63f65-0f98-42da-93d8-f26bdbc88476 Content-Length: 278 <?xml version="1.0"?> <grammar xmlns="http://www.w3.org/2001/06/grammar" xml:lang="en-US" version="1.0" mode="voice" root="digit"> <rule id="digit"> <one-of> <item>one</item> <item>two</item> <item>three</item> </one-of> </rule> </grammar> 2019-07-11 10:41:10:726822 [INFO] Assign Control Channel <579805baa38511e9@speechrecog> to Connection 172.17.2.196:1544 <-> 172.17.1.116:52216 [0] -> [1] 2019-07-11 10:41:10:726844 [INFO] Process DEFINE-GRAMMAR Request <579805baa38511e9@speechrecog> [1] 2019-07-11 10:41:10:726869 [INFO] Process DEFINE-GRAMMAR Response <579805baa38511e9@speechrecog> [1] 2019-07-11 10:41:10:726890 [INFO] Send MRCPv2 Data 172.17.2.196:1544 <-> 172.17.1.116:52216 [112 bytes] MRCP/2.0 112 1 200 COMPLETE Channel-Identifier: 579805baa38511e9@speechrecog Completion-Cause: 000 success 2019-07-11 10:41:10:727815 [INFO] Receive MRCPv2 Data 172.17.2.196:1544 <-> 172.17.1.116:52216 [273 bytes] MRCP/2.0 273 RECOGNIZE 2 Channel-Identifier: 579805baa38511e9@speechrecog Content-Type: text/uri-list Cancel-If-Queue: false Recognition-Timeout: 10000 Start-Input-Timers: true No-Input-Timeout: 5000 Content-Length: 44 session:5ce63f65-0f98-42da-93d8-f26bdbc88476 2019-07-11 10:41:10:727865 [INFO] Process RECOGNIZE Request <579805baa38511e9@speechrecog> [2] 2019-07-11 10:41:10:727876 [INFO] Open Utterance Output File [/usr/local/unimrcp/var/utter-8kHz-579805baa38511e9.pcm] for Writing 2019-07-11 10:41:10:728055 [INFO] Process RECOGNIZE Response <579805baa38511e9@speechrecog> [2] 2019-07-11 10:41:10:728077 [INFO] State Transition IDLE -> RECOGNIZING <579805baa38511e9@speechrecog> 2019-07-11 10:41:10:728134 [INFO] Send MRCPv2 Data 172.17.2.196:1544 <-> 172.17.1.116:52216 [83 bytes] MRCP/2.0 83 2 200 IN-PROGRESS Channel-Identifier: 579805baa38511e9@speechrecog 2019-07-11 10:41:11:537114 [INFO] Activity Detector state changed [1] 2019-07-11 10:41:11:547093 [INFO] Activity Detector state changed [0] 2019-07-11 10:41:11:577014 [INFO] Activity Detector state changed [1] 2019-07-11 10:41:11:586826 [INFO] Activity Detector state changed [0] 2019-07-11 10:41:11:596742 [INFO] Activity Detector state changed [1] 2019-07-11 10:41:11:606087 [INFO] Activity Detector state changed [0] 2019-07-11 10:41:11:616821 [INFO] Activity Detector state changed [1] 2019-07-11 10:41:11:626158 [INFO] Activity Detector state changed [0] 2019-07-11 10:41:11:636391 [INFO] Activity Detector state changed [1] 2019-07-11 10:41:11:646711 [INFO] Activity Detector state changed [0] 2019-07-11 10:41:11:656691 [INFO] Activity Detector state changed [1] 2019-07-11 10:41:11:666200 [INFO] Activity Detector state changed [0] 2019-07-11 10:41:11:676635 [INFO] Activity Detector state changed [1] 2019-07-11 10:41:11:686583 [INFO] Activity Detector state changed [0] 2019-07-11 10:41:11:696703 [INFO] Activity Detector state changed [1] 2019-07-11 10:41:11:706603 [INFO] Activity Detector state changed [0] 2019-07-11 10:41:11:716682 [INFO] Activity Detector state changed [1] 2019-07-11 10:41:11:726704 [INFO] Activity Detector state changed [0] 2019-07-11 10:41:11:736657 [INFO] Activity Detector state changed [1] 2019-07-11 10:41:11:746644 [INFO] Activity Detector state changed [0] 2019-07-11 10:41:11:756449 [INFO] Activity Detector state changed [1] 2019-07-11 10:41:11:766582 [INFO] Activity Detector state changed [0] 2019-07-11 10:41:11:776901 [INFO] Activity Detector state changed [1] 2019-07-11 10:41:11:786758 [INFO] Activity Detector state changed [0] 2019-07-11 10:41:11:796875 [INFO] Activity Detector state changed [1] 2019-07-11 10:41:11:806867 [INFO] Activity Detector state changed [0] 2019-07-11 10:41:11:816656 [INFO] Activity Detector state changed [1] 2019-07-11 10:41:11:826178 [INFO] Activity Detector state changed [0] 2019-07-11 10:41:11:836737 [INFO] Activity Detector state changed [1] 2019-07-11 10:41:11:846277 [INFO] Activity Detector state changed [0] 2019-07-11 10:41:11:956524 [INFO] Activity Detector state changed [1] 2019-07-11 10:41:11:966486 [INFO] Activity Detector state changed [0] 2019-07-11 10:41:11:976403 [INFO] Activity Detector state changed [1] 2019-07-11 10:41:11:986385 [INFO] Activity Detector state changed [0] 2019-07-11 10:41:11:996284 [INFO] Activity Detector state changed [1] 2019-07-11 10:41:12:006528 [INFO] Activity Detector state changed [0] 2019-07-11 10:41:12:016476 [INFO] Activity Detector state changed [1] 2019-07-11 10:41:12:026282 [INFO] Activity Detector state changed [0] 2019-07-11 10:41:12:036295 [INFO] Activity Detector state changed [1] 2019-07-11 10:41:12:046218 [INFO] Activity Detector state changed [0] 2019-07-11 10:41:12:416443 [INFO] Activity Detector state changed [1] 2019-07-11 10:41:12:426244 [INFO] Activity Detector state changed [0] 2019-07-11 10:41:12:754256 [INFO] Receive MRCPv2 Data 172.17.2.196:1544 <-> 172.17.1.116:52216 [72 bytes] MRCP/2.0 72 STOP 3 Channel-Identifier: 579805baa38511e9@speechrecog 2019-07-11 10:41:12:754472 [INFO] Process STOP Request <579805baa38511e9@speechrecog> [3] 2019-07-11 10:41:12:756876 [INFO] Process STOP Response <579805baa38511e9@speechrecog> [3] 2019-07-11 10:41:12:756977 [INFO] State Transition RECOGNIZING -> IDLE <579805baa38511e9@speechrecog> 2019-07-11 10:41:12:757051 [INFO] Send MRCPv2 Data 172.17.2.196:1544 <-> 172.17.1.116:52216 [108 bytes] MRCP/2.0 108 3 200 COMPLETE Channel-Identifier: 579805baa38511e9@speechrecog Active-Request-Id-List: 2 2019-07-11 10:41:12:761118 [INFO] TCP/MRCPv2 Peer Disconnected 172.17.2.196:1544 <-> 172.17.1.116:52216 2019-07-11 10:41:12:761411 [INFO] Receive SIP Event [nua_i_bye] Status 200 Session Terminated [SIP-Agent-1] 2019-07-11 10:41:12:761443 [INFO] Receive SIP Event [nua_i_state] Status 200 Session Terminated [SIP-Agent-1] 2019-07-11 10:41:12:761795 [NOTICE] SIP Call State 0x7f3bf4004728 [terminated] 2019-07-11 10:41:12:761838 [INFO] Receive SIP Event [nua_i_terminated] Status 200 Session Terminated [SIP-Agent-1] 2019-07-11 10:41:12:761908 [INFO] Deactivate Session 0x7f3bf4004728 <579805baa38511e9> 2019-07-11 10:41:12:761933 [INFO] Terminate Session 0x7f3bf4004728 <579805baa38511e9> 2019-07-11 10:41:12:762049 [INFO] Remove Control Channel <579805baa38511e9@speechrecog> [0] 2019-07-11 10:41:12:766471 [INFO] Close RTP Receiver 172.17.2.196:5002 <- 172.17.1.116:4002 [r:101 l:0 j:96 p:50 d:0 i:0] 2019-07-11 10:41:12:766549 [INFO] Remove RTP Session 172.17.2.196:5002 2019-07-11 10:41:12:766649 [NOTICE] Destroy TCP/MRCPv2 Connection 172.17.2.196:1544 <-> 172.17.1.116:52216 2019-07-11 10:41:12:766694 [NOTICE] Remove Session <579805baa38511e9> 2019-07-11 10:41:12:766724 [INFO] Session Terminated 0x7f3bf4004728 <579805baa38511e9> 2019-07-11 10:41:12:766785 [NOTICE] Destroy Session <579805baa38511e9> ``` ```
freeswitch对接mrcp,想用lua脚本把结果取出来然后判断结果
也是从网上找的例子,但是我想解析这个xml,判断如果是yes,播放1.mp3,no播放2.MP3,该怎么做呢,有大神知道吗,我不会lua 代码如下: ``` tryagain = 1 while (tryagain == 1) do session:execute("play_and_detect_speech",welcome .. "detect:unimrcp {start-input-timers=false,no-input-timeout=" .. no_input_timeout .. ",recognition-timeout=" .. recognition_timeout .. "}" .. grammar) xl = session:getVariable('detect_speech_result') if (xl == nil) then freeswitch.consoleLog("CRIT","电话挂断\n") tryagain = 0 else freeswitch.consoleLog("CRIT","Result is '" .. xl .. "'\n") 这里取结果,判断 session:execute("playback", huifu2) tryagain = 0 end end ``` 得到的xml如下 ``` <result> <interpretation grammar="" confidence="1.0"> <instance> <callId>hostname-4418_35629.1554048033766857898-841227</callId> <logId>EDC18579-98CC-4649-9E60-6D5A1C71FEE0_-1</logId> <rolecategory>CLIENT</rolecategory> <extJson> <snStartTime>00:06.559</snStartTime> <snStopTime>00:07.519</snStopTime> <speed>1.04</speed></extJson> <categotyId>TXT</categotyId> </instance> <input mode="speech">yes,</input> </interpretation> </result> ```
关于FreeSWITCH_1.6视频
我想在FS里面将传输的视频数据截取保存至本地,将本地raw通过FS发送出去,对于视频源的处理这部分应该在哪里操作,我在这纠结了两天了,望大神拯救。 PS:我的FS用的是1.6版本的
请问哪位大神有sip.js的学习资料和demo
是这样的,公司现在需要搭建一个网页语音通话系统,用freeswitch+sip.js来做, 但是sip.js学习资料好少,有哪位大神有学习资料哥demo吗?有的话跪求给一份,感激不尽, 官网的话,我已经知道了,就不用给了
使用LibLinphone发送dtmf进行IVR菜单选择问题
我用LibLinphone作为库开发实现sip电话的android APP,遇到了一个问题:我这里用FreeSwitch做SIP服务器,当我拨通电话听到IVR菜单时,我拨号发送dtmf信息时并没有实现菜单选择的功能,没有任何反映! 我下载了Linphone应用可以实现IVR菜单选择功能,但我使用Linphone源码在eclipse中直接运行后执行IVR菜单选择功能时仍然没有任何反映,不知是为什么,有没有大神能给小弟点提示,多谢!!!!!!!!!!!!
Sipml5发布到Apache上打不出去电话
各位大神,下午好,之前在网上下载的Sipml5Demo,结合后台Freeswitch配置好,在本地各个功能完全都能用起来,但是今天将sipml5Demo发布到Apache和IIS服务器上以后,用谷歌浏览器访问登陆都没问题,可是就是拨不出去号,一拨号就显示错误“Media stream permission deniedCall control”
请教熟悉apr函数库的大神:函数apr_pstrndup的工作方式
因为开发FreeSWITCH,接触到Apache的函数库libapr。 对于其字符串函数的工作方式很不理解,请教一下。 这个函数的格式如下: char* apr_pstrndup ( apr_pool_t * p, const char * s, apr_size_t n ) Duplicate at most n characters of a string into memory allocated out of a pool; the new string will be NUL-terminated Parameters: p The pool to allocate out of s The string to duplicate n The maximum number of characters to duplicate Returns: The new string Remarks: The amount of memory allocated from the pool is the length of the returned string including the NUL terminator 看上去很好理解,就是从内存池中分配一个新的空间,把现有内容复制过去。 但是问题来了:我没有看到清理这片内存的函数。也就是说,这片被分配的内容,要一直等到内存池被销毁的时候,才会被清理吗?这样也太不科学了。 有哪位大神可以解答一下我的疑问?
相见恨晚的超实用网站
相见恨晚的超实用网站 持续更新中。。。
Java学习的正确打开方式
在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是国内的书籍,博客次之,这又是一个层次了,这里暂时不提后面再谈。博主将为各位入门java保驾护航,各位只管冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你。 何谓学习?博主所理解的学习,它是一个过程,是一个不断累积、不断沉淀、不断总结、善于传达自己的个人见解以及乐于分享的过程。
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过...
java中的Static、final、Static final各种用法
前言 对Static、final、Static final这几个关键词熟悉又陌生?想说却又不知怎么准确说出口?好的,本篇博客文章将简短概要出他们之间的各自的使用,希望各位要是被你的面试官问到了,也能从容的回答… static 加载:static在类加载时初始化(加载)完成 含义:Static意为静态的,但凡被static 修饰说明属于类,不属于类的对象。 可修饰:Static 可以修饰 内部类、方...
各大公司在GitHub上开源投入排名分析
基于GitHub的数据进行分析各个公司在开源上的投入排名
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...
linux系列之常用运维命令整理笔录
本博客记录工作中需要的linux运维命令,大学时候开始接触linux,会一些基本操作,可是都没有整理起来,加上是做开发,不做运维,有些命令忘记了,所以现在整理成博客,当然vi,文件操作等就不介绍了,慢慢积累一些其它拓展的命令,博客不定时更新 free -m 其中:m表示兆,也可以用g,注意都要小写 Men:表示物理内存统计 total:表示物理内存总数(total=used+free) use...
python学习方法总结(内附python全套学习资料)
不要再问我python好不好学了 我之前做过半年少儿编程老师,一个小学四年级的小孩子都能在我的教学下独立完成python游戏,植物大战僵尸简单版,如果要肯花时间,接下来的网络开发也不是问题,人工智能也可以学个调包也没啥问题。。。。。所以python真的是想学就一定能学会的!!!! --------------------华丽的分割线-------------------------------- ...
Spring Boot 开发微信公众号后台
Hello 各位小伙伴,松哥今天要和大家聊一个有意思的话题,就是使用 Spring Boot 开发微信公众号后台。 很多小伙伴可能注意到松哥的个人网站(http://www.javaboy.org)前一阵子上线了一个公众号内回复口令解锁网站文章的功能,还有之前就有的公众号内回复口令获取超 2TB 免费视频教程的功能(免费视频教程),这两个都是松哥基于 Spring Boot 来做的,最近松哥打算通...
兼职程序员一般可以从什么平台接私活?
这个问题我进行了系统性的总结,以下将进行言简意赅的说明和渠道提供,希望对各位小猿/小媛们有帮助~ 根据我们的经验,程序员兼职主要分为三种:兼职职位众包、项目整包和自由职业者驻场。 所谓的兼职职位众包,指的是需求方这边有自有工程师配合,只需要某个职位的工程师开发某个模块的项目。比如开发一个 app,后端接口有人开发,但是缺少 iOS 前端开发工程师,那么他们就会发布一个职位招聘前端,来配合公司一...
程序员接私活怎样防止做完了不给钱?
首先跟大家说明一点,我们做 IT 类的外包开发,是非标品开发,所以很有可能在开发过程中会有这样那样的需求修改,而这种需求修改很容易造成扯皮,进而影响到费用支付,甚至出现做完了项目收不到钱的情况。 那么,怎么保证自己的薪酬安全呢? 我们在开工前,一定要做好一些证据方面的准备(也就是“讨薪”的理论依据),这其中最重要的就是需求文档和验收标准。一定要让需求方提供这两个文档资料作为开发的基础。之后开发...
网页实现一个简单的音乐播放器(大佬别看。(⊙﹏⊙))
今天闲着无事,就想写点东西。然后听了下歌,就打算写个播放器。 于是乎用h5 audio的加上js简单的播放器完工了。 演示地点演示 html代码如下` music 这个年纪 七月的风 音乐 ` 然后就是css`*{ margin: 0; padding: 0; text-decoration: none; list-...
Python十大装B语法
Python 是一种代表简单思想的语言,其语法相对简单,很容易上手。不过,如果就此小视 Python 语法的精妙和深邃,那就大错特错了。本文精心筛选了最能展现 Python 语法之精妙的十个知识点,并附上详细的实例代码。如能在实战中融会贯通、灵活使用,必将使代码更为精炼、高效,同时也会极大提升代码B格,使之看上去更老练,读起来更优雅。
数据库优化 - SQL优化
以实际SQL入手,带你一步一步走上SQL优化之路!
2019年11月中国大陆编程语言排行榜
2019年11月2日,我统计了某招聘网站,获得有效程序员招聘数据9万条。针对招聘信息,提取编程语言关键字,并统计如下: 编程语言比例 rank pl_ percentage 1 java 33.62% 2 cpp 16.42% 3 c_sharp 12.82% 4 javascript 12.31% 5 python 7.93% 6 go 7.25% 7 p...
C++知识点 —— 整合(持续更新中)
本文记录自己在自学C++过程中不同于C的一些知识点,适合于有C语言基础的同学阅读。如果纰漏,欢迎回复指正 目录 第一部分 基础知识 一、HelloWorld与命名空间 二、引用和引用参数 2.1引用的定义 2.2 将引用用作函数参数 2.3 将引用用于类对象 2.4 引用和继承 2.5 何时使用引用参数 2.6 引用和指针的区别 三、内联函数 四、默认参数的...
《奇巧淫技》系列-python!!每天早上八点自动发送天气预报邮件到QQ邮箱
将代码部署服务器,每日早上定时获取到天气数据,并发送到邮箱。 也可以说是一个小型人工智障。 知识可以运用在不同地方,不一定非是天气预报。
js知识点汇总
1.本门课的作用(JavaScript的作用)所有基于Web的程序开发基础 2.一种计算机客户端脚本语言,主要在Web浏览器解释执行。 3.浏览器中Javascript,用于与用户交互,以及实现页面中各种动态特效 4.在HTML文件中,任何JavaScript代码必须放到&lt;script&gt;标签中 5.把JavaScript代码放到外部文件中,在HTML代码中直接引入该文件(外部文...
经典算法(5)杨辉三角
杨辉三角 是经典算法,这篇博客对它的算法思想进行了讲解,并有完整的代码实现。
Python实例大全(基于Python3.7.4)
博客说明: 这是自己写的有关python语言的一篇综合博客。 只作为知识广度和编程技巧学习,不过于追究学习深度,点到即止、会用即可。 主要是基础语句,如三大控制语句(顺序、分支、循环),随机数的生成,数据类型的区分和使用; 也会涉及常用的算法和数据结构,以及面试题相关经验; 主体部分是针对python的数据挖掘和数据分析,主要先攻爬虫方向:正则表达式匹配,常用数据清洗办法,scrapy及其他爬虫框架,数据存储方式及其实现; 最后还会粗略涉及人工智能领域,玩转大数据与云计算、进行相关的预测和分析。
面试官:你连RESTful都不知道我怎么敢要你?
干货,2019 RESTful最贱实践
论文读不懂怎么办?
王树义读完需要18分钟速读仅需6分钟悄悄告诉你几个窍门。1 痛苦做科研,不能不读论文。但是,我见过不少研究生,论文都读得愁眉苦脸的。这其中,自然有因为拖延的关系。例如教授布置了2周后讨论论文,你原本可以每天抽出时间,慢慢消化。可你非得拖到截止日期的前一天晚上才打开看,希望毕其功于一役……这显然是态度问题。但是,不可忽略的,有些同学,却真的不是态度问题,而是方法不当。他们喜欢跟论文死磕。读不懂,...
用Python解决数据结构与算法问题(三):线性数据结构之栈
python学习之路 - 从入门到精通到大师 文章目录[python学习之路 - 从入门到精通到大师](https://blog.csdn.net/TeFuirnever/article/details/90017382)〇、写在前面3.1.目标3.2.什么是线性数据结构3.3.什么是栈3.4.栈的抽象数据类型3.5.Python实现栈3.6.简单括号匹配3.7.符号匹配3.8.十进制转换成二进制...
刷了几千道算法题,这些我私藏的刷题网站都在这里了!
遥想当年,机缘巧合入了 ACM 的坑,周边巨擘林立,从此过上了"天天被虐似死狗"的生活… 然而我是谁,我可是死狗中的战斗鸡,智力不够那刷题来凑,开始了夜以继日哼哧哼哧刷题的日子,从此"读题与提交齐飞, AC 与 WA 一色 ",我惊喜的发现被题虐既刺激又有快感,那一刻我泪流满面。这么好的事儿作为一个正直的人绝不能自己独享,经过激烈的颅内斗争,我决定把我私藏的十几个 T 的,阿不,十几个刷题网...
Java面试官最爱问的volatile关键字
在Java的面试当中,面试官最爱问的就是volatile关键字相关的问题。经过多次面试之后,你是否思考过,为什么他们那么爱问volatile关键字相关的问题?而对于你,如果作为面试官,是否也会考虑采用volatile关键字作为切入点呢? 为什么爱问volatile关键字 爱问volatile关键字的面试官,大多数情况下都是有一定功底的,因为volatile作为切入点,往底层走可以切入Java内存模...
项目中的if else太多了,该怎么重构?
介绍 最近跟着公司的大佬开发了一款IM系统,类似QQ和微信哈,就是聊天软件。我们有一部分业务逻辑是这样的 if (msgType = "文本") { // dosomething } else if(msgType = "图片") { // doshomething } else if(msgType = "视频") { // doshomething } else { // doshom...
致 Python 初学者
欢迎来到“Python进阶”专栏!来到这里的每一位同学,应该大致上学习了很多 Python 的基础知识,正在努力成长的过程中。在此期间,一定遇到了很多的困惑,对未来的学习方向感到迷茫。我非常理解你们所面临的处境。我从2007年开始接触 python 这门编程语言,从2009年开始单一使用 python 应对所有的开发工作,直至今天。回顾自己的学习过程,也曾经遇到过无数的困难,也曾经迷茫过、困惑过。开办这个专栏,正是为了帮助像我当年一样困惑的 Python 初学者走出困境、快速成长。希望我的经验能真正帮到你
【C++100问】深入理解理解顶层const和底层const
专栏C++学习笔记 声明 1)该文章整理自网上的大牛和相关专家无私奉献的资料,具体引用的资料请看参考文献。 2)本文仅供学术交流,非商用。所以每一部分具体的参考资料并没有详细对应。如果某部分不小心侵犯了大家的利益,还望海涵,并联系博主删除。 3)博主才疏学浅,文中如有不当之处,请各位指出,共同进步,谢谢。 4)此属于第一版本,若有错误,还需继续修正与增删。还望大家多多指点。大家都共享一点点,一起为...
吐血推荐珍藏的Visual Studio Code插件
作为一名Java工程师,由于工作需要,最近一个月一直在写NodeJS,这种经历可以说是一部辛酸史了。好在有神器Visual Studio Code陪伴,让我的这段经历没有更加困难。眼看这段经历要告一段落了,今天就来给大家分享一下我常用的一些VSC的插件。 VSC的插件安装方法很简单,只需要点击左侧最下方的插件栏选项,然后就可以搜索你想要的插件了。 下面我们进入正题 Material Theme ...
《C++ Primer》学习笔记(五):循环、分支、跳转和异常处理语句
专栏C++学习笔记 《C++ Primer》学习笔记/习题答案 总目录 https://blog.csdn.net/TeFuirnever/article/details/100700212 —————————————————————————————————————————————————————— 《C++ Primer》习题参考答案:第5章 - 语句 文章目录专栏C++学习笔记语句1、...
shell一文入门通
简单来说“Shell编程就是对一堆Linux命令的逻辑化处理”。 W3Cschool 上的一篇文章是这样介绍 Shell的 hello world 学习任何一门编程语言第一件事就是输出HelloWord了!下面我会从新建文件到shell代码编写来说下Shell 编程如何输出Hello World。 (1)新建一个文件 helloworld.sh :touch helloworld.sh,扩...
“狗屁不通文章生成器”登顶GitHub热榜,分分钟写出万字形式主义大作
一、垃圾文字生成器介绍 最近在浏览GitHub的时候,发现了这样一个骨骼清奇的雷人项目,而且热度还特别高。 项目中文名:狗屁不通文章生成器 项目英文名:BullshitGenerator 根据作者的介绍,他是偶尔需要一些中文文字用于GUI开发时测试文本渲染,因此开发了这个废话生成器。但由于生成的废话实在是太过富于哲理,所以最近已经被小伙伴们给玩坏了。 他的文风可能是这样的: 你发现,...
程序员:我终于知道post和get的区别
是一个老生常谈的话题,然而随着不断的学习,对于以前的认识有很多误区,所以还是需要不断地总结的,学而时习之,不亦说乎
GitHub标星近1万:只需5秒音源,这个网络就能实时“克隆”你的声音
作者 | Google团队 译者 | 凯隐 编辑 | Jane 出品 | AI科技大本营(ID:rgznai100) 本文中,Google 团队提出了一种文本语音合成(text to speech)神经系统,能通过少量样本学习到多个不同说话者(speaker)的语音特征,并合成他们的讲话音频。此外,对于训练时网络没有接触过的说话者,也能在不重新训练的情况下,仅通过未知...
加快推动区块链技术和产业创新发展,2019可信区块链峰会在京召开
11月8日,由中国信息通信研究院、中国通信标准化协会、中国互联网协会、可信区块链推进计划联合主办,科技行者协办的2019可信区块链峰会将在北京悠唐皇冠假日酒店开幕。   区块链技术被认为是继蒸汽机、电力、互联网之后,下一代颠覆性的核心技术。如果说蒸汽机释放了人类的生产力,电力解决了人类基本的生活需求,互联网彻底改变了信息传递的方式,区块链作为构造信任的技术有重要的价值。   1...
相关热词 c#委托 逆变与协变 c#新建一个项目 c#获取dll文件路径 c#子窗体调用主窗体事件 c# 拷贝目录 c# 调用cef 网页填表c#源代码 c#部署端口监听项目、 c#接口中的属性使用方法 c# 昨天
立即提问