<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[luozirong的专栏]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/luozirong</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; luozirong]]></copyright><item><title><![CDATA[WebRTC直播技术(二)-ICE/STUN/TURN]]></title><link>https://blog.youkuaiyun.com/luozirong/article/details/81012835</link><guid>https://blog.youkuaiyun.com/luozirong/article/details/81012835</guid><author>luozirong</author><pubDate>Thu, 12 Jul 2018 11:22:51 +0800</pubDate><description><![CDATA[原文:http://imweb.io/topic/5a4a6cb2a192c3b460fce37f 
首先要掌握WebRTC连接建立过程，需要掌握几个知识点： NAT, ICE, STUN, TURN, DTLS等。如果之前有接触过P2P相关技术的同学可能就会比较容易理解。WebRTC是一个基于浏览器与浏览器之间的实时音视频通话方案，那么有于公网ip地址有限的问题，用户的浏览器常常位于NAT后，那...]]></description><category></category></item><item><title><![CDATA[libsrtp rtpw 例子代码分析]]></title><link>https://blog.youkuaiyun.com/luozirong/article/details/80656998</link><guid>https://blog.youkuaiyun.com/luozirong/article/details/80656998</guid><author>luozirong</author><pubDate>Mon, 11 Jun 2018 19:50:17 +0800</pubDate><description><![CDATA[libsrtp安装

下载：https://github.com/cisco/libsrtp.git 
cd  your path/libsrtp-master 
./configure 
make 
make runtest 
make install

测试的方法是：

cd test 
./rtpw_test.sh 
其实分析里面的实现主要是创建了两个进程： 
./rtpw -b Ky7cU...]]></description><category></category></item><item><title><![CDATA[libnice simple-example 分析]]></title><link>https://blog.youkuaiyun.com/luozirong/article/details/80626552</link><guid>https://blog.youkuaiyun.com/luozirong/article/details/80626552</guid><author>luozirong</author><pubDate>Fri, 08 Jun 2018 18:05:21 +0800</pubDate><description><![CDATA[编译安装

直接从git上下载源码，然后编译安装，开始遇到很多依赖问题，最后采用下载老版本的分支编译。

发起端输出

root@iZbp1bp634mlawwh9rif75Z:~/libnice-0.1.9# simple-example 0 stunserver.org
Copy this line to remote client:

  qgbF 7ghYVTRnQ8xzqV7TWmC+M...]]></description><category></category></item><item><title><![CDATA[（转）WebRTC手记之初探]]></title><link>https://blog.youkuaiyun.com/luozirong/article/details/80596674</link><guid>https://blog.youkuaiyun.com/luozirong/article/details/80596674</guid><author>luozirong</author><pubDate>Wed, 06 Jun 2018 16:13:28 +0800</pubDate><description><![CDATA[WebRTC是HTML5支持的重要特性之一，有了它，不再需要借助音视频相关的客户端，直接通过浏览器的Web页面就可以实现音视频对聊功能。而且WebRTC项目是开源的，我们可以借助WebRTC源码快速构建自己的音视频对聊功能。无论是使用前端JS的WebRTC API接口，还是在WebRTC源码上构建自己的对聊框架，都需要遵循以下执行流程： 
 
上述序列中，WebRTC并不提供Stun服务器和Sig...]]></description><category></category></item><item><title><![CDATA[MRCP UA的创建及SIP信令处理]]></title><link>https://blog.youkuaiyun.com/luozirong/article/details/79893647</link><guid>https://blog.youkuaiyun.com/luozirong/article/details/79893647</guid><author>luozirong</author><pubDate>Wed, 11 Apr 2018 11:19:12 +0800</pubDate><description><![CDATA[在mrcp_sofia_task_initialize中调用nua_create一个UA(User agent)这个跟freeswitch SIP信令的接收，是一样的。在nua_create的时候会设置回调函数：mrcp_sofia_event_callback()。接下来的处理都是一样的，只是有事件的时候的回调不一样。现在调用的是mrcp_sofia_event_callback（）。



/...]]></description><category></category></item><item><title><![CDATA[NAT穿越原理——STUN]]></title><link>https://blog.youkuaiyun.com/luozirong/article/details/79555498</link><guid>https://blog.youkuaiyun.com/luozirong/article/details/79555498</guid><author>luozirong</author><pubDate>Wed, 14 Mar 2018 15:34:18 +0800</pubDate><description><![CDATA[STUN是RFC3489规定的一种NAT穿透方式，它采用辅助的方法探测NAT的IP和端口。毫无疑问的，它对穿越早期的NAT起了巨大的作用，并且还将继续在ANT穿透中占有一席之地。 

STUN的探测过程需要有一个公网IP的STUN server，在NAT后面的UAC必须和此server配合，互相之间发送若干个UDP数据包。UDP包中包含有UAC需要了解的信息，比如NAT外网 IP，PORT等等。U...]]></description><category></category></item><item><title><![CDATA[freeswitch SIP信令的接收]]></title><link>https://blog.youkuaiyun.com/luozirong/article/details/79197801</link><guid>https://blog.youkuaiyun.com/luozirong/article/details/79197801</guid><author>luozirong</author><pubDate>Mon, 29 Jan 2018 17:28:21 +0800</pubDate><description><![CDATA[freeswitch SIP信令的处理在mod_sofia中 
首先在模块的加载(mod_sofia_load)里面会创建一个处理SIP消息的线程:



    /* start one message thread */
    switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Starting initial message th]]></description><category></category></item><item><title><![CDATA[freeswitch mrcp 源码分析--数据包的发送]]></title><link>https://blog.youkuaiyun.com/luozirong/article/details/79006335</link><guid>https://blog.youkuaiyun.com/luozirong/article/details/79006335</guid><author>luozirong</author><pubDate>Mon, 08 Jan 2018 19:26:22 +0800</pubDate><description><![CDATA[在MRCP 开始语音识别后会调用recog_channel_start（）函数



static switch_status_t recog_channel_start(speech_channel_t *schannel)
{
    switch_status_t status = SWITCH_STATUS_SUCCESS;
    switch_hash_index_t *egk;]]></description><category></category></item><item><title><![CDATA[freeswitch Session dtmf callback的触发过程]]></title><link>https://blog.youkuaiyun.com/luozirong/article/details/78956716</link><guid>https://blog.youkuaiyun.com/luozirong/article/details/78956716</guid><author>luozirong</author><pubDate>Tue, 02 Jan 2018 22:52:32 +0800</pubDate><description><![CDATA[在创建一个Session后会调用switch_core_session_thread_launch（）创建一个对应的线程]]></description><category></category></item><item><title><![CDATA[freeswitch lua/luarun的执行过程]]></title><link>https://blog.youkuaiyun.com/luozirong/article/details/78952146</link><guid>https://blog.youkuaiyun.com/luozirong/article/details/78952146</guid><author>luozirong</author><pubDate>Tue, 02 Jan 2018 15:15:29 +0800</pubDate><description><![CDATA[在mod_lua.cpp文件中定义了两个api 
SWITCH_STANDARD_APP(lua_function) 
SWITCH_STANDARD_API(luarun_api_function) 
分别对应lua和luarun命令，所有以宏SWITCH_STANDARD_API定义的都是freeswitch暴露的api接口。 
我们这里以luarun为例分析



SWITCH_STANDA]]></description><category></category></item><item><title><![CDATA[freeswitch.Session的实现过程]]></title><link>https://blog.youkuaiyun.com/luozirong/article/details/78940388</link><guid>https://blog.youkuaiyun.com/luozirong/article/details/78940388</guid><author>luozirong</author><pubDate>Sun, 31 Dec 2017 02:47:58 +0800</pubDate><description><![CDATA[一.创建Session

在lua中通过调用 freeswitch.Session（）可以创建一个Session对象。按源码里的注释，他包括四个原型： 
LUA::Session::Session() 
LUA::Session::Session(char ,CoreSession ) 
LUA::Session::Session(char *) 
LUA::Session::Session(sw]]></description><category></category></item><item><title><![CDATA[freeswitch mrcp 源码分析--event事件产生]]></title><link>https://blog.youkuaiyun.com/luozirong/article/details/78881825</link><guid>https://blog.youkuaiyun.com/luozirong/article/details/78881825</guid><author>luozirong</author><pubDate>Sat, 23 Dec 2017 19:52:03 +0800</pubDate><description><![CDATA[event事件的构建主要在speech_thread（）函数里面。static void *SWITCH_THREAD_FUNC speech_thread(switch_thread_t *thread, void *obj)
{
    struct speech_thread_handle *sth = (struct speech_thread_handle *) obj;
    swit]]></description><category></category></item><item><title><![CDATA[freeswitch mrcp 源码分析--数据接收（下）]]></title><link>https://blog.youkuaiyun.com/luozirong/article/details/78876787</link><guid>https://blog.youkuaiyun.com/luozirong/article/details/78876787</guid><author>luozirong</author><pubDate>Fri, 22 Dec 2017 21:03:23 +0800</pubDate><description><![CDATA[在前两篇我们介绍了mrcp接收后的处理，最后会调用apr_queue_push扔到消息队列里面。 
对应的，在apt_consumer_task.apt_consumer_task_run（）中会循环调用pr_queue.apr_queue_pop（）从队列里面取出数据：apt_consumer_task.apt_consumer_task_run –> 
apr_queue.apr_queue_p]]></description><category></category></item><item><title><![CDATA[freeswitch mrcp 源码分析--数据接收（上）]]></title><link>https://blog.youkuaiyun.com/luozirong/article/details/78875325</link><guid>https://blog.youkuaiyun.com/luozirong/article/details/78875325</guid><author>luozirong</author><pubDate>Fri, 22 Dec 2017 17:20:36 +0800</pubDate><description><![CDATA[apt_poller_tas.apt_poller_task_run–> mrcp_client_connection.mrcp_client_poller_signal_process–> 
sendrecv.apr_socket_recv –> 
mrcp_stream.mrcp_parser_run –> 
mrcp_client_connection.mrcp_client_message_]]></description><category></category></item><item><title><![CDATA[coredump分析]]></title><link>https://blog.youkuaiyun.com/luozirong/article/details/78863286</link><guid>https://blog.youkuaiyun.com/luozirong/article/details/78863286</guid><author>luozirong</author><pubDate>Thu, 21 Dec 2017 14:16:38 +0800</pubDate><description><![CDATA[static void *audio_bridge_thread(switch_thread_t *thread, void *obj)
{
	switch_ivr_bridge_data_t *data = obj;
	int stream_id = 0, pre_b = 0, ans_a = 0, ans_b = 0, originator = 0;
	switch_input_callbac]]></description><category></category></item><item><title><![CDATA[freeswitch mrcp 源码分析--数据解析]]></title><link>https://blog.youkuaiyun.com/luozirong/article/details/78857016</link><guid>https://blog.youkuaiyun.com/luozirong/article/details/78857016</guid><author>luozirong</author><pubDate>Wed, 20 Dec 2017 20:12:06 +0800</pubDate><description><![CDATA[/** Parse message by raising corresponding event handlers */
APT_DECLARE(apt_message_status_e) apt_message_parser_run(apt_message_parser_t *parser, apt_text_stream_t *stream, void **message)
{
	const]]></description><category></category></item><item><title><![CDATA[freeswitch 使用的问题]]></title><link>https://blog.youkuaiyun.com/luozirong/article/details/78627126</link><guid>https://blog.youkuaiyun.com/luozirong/article/details/78627126</guid><author>luozirong</author><pubDate>Fri, 24 Nov 2017 18:10:41 +0800</pubDate><description><![CDATA[1.呼叫另一台主机的命令
originate sofia/external/1000@11.239.168.3 &echo
报错：
[ERR] sofia_reg.c:2616 Cannot locate any authentication credentials to complete an authentication request for realm '"11.239.161.25]]></description><category></category></item><item><title><![CDATA[freeswitch 在redhat 7.0/centos 7.0上的编译安装]]></title><link>https://blog.youkuaiyun.com/luozirong/article/details/78532679</link><guid>https://blog.youkuaiyun.com/luozirong/article/details/78532679</guid><author>luozirong</author><pubDate>Tue, 14 Nov 2017 17:27:43 +0800</pubDate><description><![CDATA[参考官方文档：
https://freeswitch.org/confluence/display/FREESWITCH/CentOS+7

https://freeswitch.org/confluence/display/FREESWITCH/CentOS+7+and+RHEL+7



1) Make sure yum update is run and CentOS is u]]></description><category></category></item><item><title><![CDATA[ibatis执行过程]]></title><link>https://blog.youkuaiyun.com/luozirong/article/details/76460618</link><guid>https://blog.youkuaiyun.com/luozirong/article/details/76460618</guid><author>luozirong</author><pubDate>Mon, 31 Jul 2017 17:41:30 +0800</pubDate><description><![CDATA[1.初始化SqlMapClient对象，主要设置DataSource，读取ibatis的xml配置文件将里面的信息转化为一个个数据对象
2.调用SqlMapClientTemplate的对应的方法比如queryForObject
3.调用SqlMapSessionImpl().queryForObject()方法
4.调用 SqlMapExecutorDelegate的queryForObj]]></description><category></category></item><item><title><![CDATA[TensorFlow word2vec_basic 代码分析]]></title><link>https://blog.youkuaiyun.com/luozirong/article/details/73275847</link><guid>https://blog.youkuaiyun.com/luozirong/article/details/73275847</guid><author>luozirong</author><pubDate>Thu, 15 Jun 2017 11:35:17 +0800</pubDate><description><![CDATA[将字母向量化（即 word embedding）是NLP的基础，在TensorFlow中有一个简单的实现即word2vec（这篇文章主要关注他的基本实现,demo在这个目录下：tensorflow/examples/tutorials/word2vec/word2vec_basic.py）。关于word2vec的介绍非常多理论也一堆一堆的，下面是本文参考的几篇主要的理论文章：
http://ww]]></description><category></category></item></channel></rss>