Freeswitch内核研究之录音

本文详细介绍了Freeswitch中的录音实现机制,包括注册回调函数监听流媒体、内核读写语音帧、以及不同录音模式的工作流程。文章还探讨了如何通过设置通道变量来优化录音效果。

                                                          Freeswitch内核研究之录音

 

一、注册回调函数

应用程序调用switch_ivr_record_session->

switch_core_media_bug_add向fs内核注册mediabug接口回调函数record_callback监听流媒体(读写模式)

 

二、内核调用switch_core_session_read_frame获取来话语音

1、调用endpoint的read_frame函数获取endpoint的语音。

 

2、调用media bug的回调函数record_callback通知应用程序获取语音数据。

 

3、应用程序如果设置通道变量RECORD_USE_THREAD为true,内核开启线程录音,内核会把录音数据缓冲到thread_buffer,再通过线程来读取缓冲写文件。否则直接写文件。(如果录音丢数据,可采用线程方式录音)

 

4、内核写文件

内核为每个录音缓冲池pre_buffer,将需要写入文件的数据写入到此缓冲内,当缓冲数据大小大于 SWITCH_DEFAULT_FILE_BUFFER_LEN = 65536

时,内核从缓冲池中获取数据写文件。应用程序可以通过设置通道变量enable_file_write_buffering来设置 SWITCH_DEFAULT_FILE_BUFFER_LEN的大小。

 

三、内核调用switch_core_session_write_frame写入语音

1、调用endpoint的write_frame函数给endpoint发送语音

 

2、调用media bug的回调函数record_callback通知应用程序获取语音数据

 

3、同步骤二(3)。

FreeSWITCH 作为一款功能丰富的开源通信软件,具备实现多个录音的能力。在实现多个录音时,可以借助其配置文件来完成。 以下给出一个在 dialplan 配置文件中实现多个录音的示例代码: ```xml <document type="freeswitch/xml"> <section name="dialplan"> <context name="default"> <extension name="call"> <!-- expression 为拨号规则,去电号码通过正则表达式后才应用当前规则 --> <condition field="destination_number" expression="1001"> <!-- 第一个录音动作 --> <action application="record_session" data="/tmp/${strftime(%Y-%m-%d)}/${caller_id_number}_${destination_number}_1.wav"/> <action application="set" data="recordfile1=/tmp/${strftime(%Y-%m-%d)}/${caller_id_number}_${destination_number}_1.wav"/> <action application="set" data="recordname1=${caller_id_number}_${destination_number}_1.wav"/> <!-- 第二个录音动作 --> <action application="record_session" data="/tmp/${strftime(%Y-%m-%d)}/${caller_id_number}_${destination_number}_2.wav"/> <action application="set" data="recordfile2=/tmp/${strftime(%Y-%m-%d)}/${caller_id_number}_${destination_number}_2.wav"/> <action application="set" data="recordname2=${caller_id_number}_${destination_number}_2.wav"/> <action application="bridge" data="user/1001,user/1002" /> </condition> </extension> </context> </section> </document> ``` 在上述代码里,通过添加多个 `record_session` 动作,为每次通话创建了多个录音文件,并且对每个录音文件分别设置了对应的变量,以此实现多个录音的目的。
评论 8
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值