当前位置:网站首页>【FreeSwitch开发实践】media bug获取通话语音流
【FreeSwitch开发实践】media bug获取通话语音流
2022-07-29 02:47:00 【小小马车夫】
博客主页:小小马车夫的主页
所属专栏:FreeSwitch开发实践
专栏介绍:主要介绍博主在实际项目中使用FreeSwitch开发外呼类项目的一些经验心得,主要涉及FreeSwitch的基本安装编译、基本配置、ESL、WSS、录音、自定义模块、media bug、语音播放、MRCP及对接AI机器人等内容。内容在持续更新中,如果感兴趣可以对专栏进行订阅~想对未来的自己说的话间歇性的努力和蒙混过日子,都是对之前努力的清零

文章目录
前言
上一篇介绍创建和使用自定义模块,创建一个自己的app嵌入到FreeSwitch;这一篇介绍运用“media bug”,获取通话语音流。首先,看到这儿,应该会有两个问题:
- 什么是media bug
- media bug有什么用,能干什么
第一个问题我们放到后面详细介绍,第二个问题media bug能干什么,media bug主要用来监听通话语音数据,而拿到通话语音流了可以做很多事情,可以加不少业务: - 通话监听
- 分析语音,即通常说的ASR(语音识别)
一、什么是media bug
media bug中的bug并不是软件缺陷的意思,它的作用是在FreeSwitch媒体通话数据流(语音或视频)中截取这部分数据流,达到监听的作用,类似从一个管道安插一个管道,这个管道就是“media bug”, 相当于打一个“洞”,所以media bug的bug应该称为“盗取”、“截取”的意思。
二、如何使用media bug获取通话语音流
首先,看一段media bug创建和获取通话语音流的例子:
2.1 media bug创建
switch_status_t status;
switch_media_bug_t *bug;
//添加media bug
status = switch_core_media_bug_add(session, "mymedia", 0, mymediabug_callback, (void*)robot_id, 0, SMBF_READ_STREAM | SMBF_NO_PAUSE, &bug);
我们看一下switch_core_media_bug_add的声明:
SWITCH_DECLARE(switch_status_t) switch_core_media_bug_add(_In_ switch_core_session_t *session,
_In_ const char *function,
_In_ const char *target,
_In_ switch_media_bug_callback_t callback,
_In_opt_ void *user_data,
_In_ time_t stop_time,
_In_ switch_media_bug_flag_t flags, _Out_ switch_media_bug_t **new_bug);
函数说明:
| session | 会话session |
|---|---|
| function | media bug函数名称,可以作为唯一key,一个key对应一个media bug, 对应Media-Bug-Function |
| target | 目标,对应Media-Bug-Taget |
| callback | media bug回调函数 |
| user_data | 回调函数的传入数据 |
| stop_time | 停止时间 |
| flags | 标志,不标志,回调函数中监听不通的功能 |
| new_bug | 传出参数, 新创建media bug |
2.2 media bug回调函数
static switch_bool_t mymediabug_callback(switch_media_bug_t *bug, void *user_data, switch_abc_type_t type)
{
switch_core_session_t* session = switch_core_media_bug_get_session(bug);
uint8_t data[SWITCH_RECOMMENDED_BUFFER_SIZE];
switch_frame_t frame = {
0 };
frame.data = data;
frame.buflen = sizeof(data);
const char*robot_id = (const char *) user_data;
if (robot_id == NULL) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "mymedia user data is null!");
return SWITCH_FALSE;
}
switch (type) {
case SWITCH_ABC_TYPE_INIT:
{
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "mymediabug init, user_data[%s]\n", robot_id);
}
break;
case SWITCH_ABC_TYPE_READ:
{
if (switch_core_media_bug_read(bug, &frame, SWITCH_FALSE) != SWITCH_STATUS_FALSE) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "read frame: data_len=[%d], rate[%d], channels[%d], samples[%d] \n",
frame.datalen, frame.rate, frame.channels, frame.samples);
}
}
break;
case SWITCH_ABC_TYPE_CLOSE:
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "mymediabug close, user_data[%s]\n", robot_id);
break;
default:
break;
}
return SWITCH_TRUE;
}
说明:
SWITCH_ABC_TYPE_READ这里就是语音流获取的地方,
switch_core_media_bug_read即获取语音数据的接口,下面看下这个接口的声明:
SWITCH_DECLARE(switch_status_t) switch_core_media_bug_read(_In_ switch_media_bug_t *bug, _In_ switch_frame_t *frame, switch_bool_t fill);
这个接口参数比较简单, bug就是media bug指针, frame是语音数据结构体
2.3 media bug的原理
这里不展开说明media bug的底层实现,只是简要说一下media bug 的实现。要想了解media bug可以从接口switch_core_media_bug_add入手,其实media bug并没有开起新线程, 从源码得知只是视频video会开线程,而音频不会,那它是如何监听音频流呢,答案是switch_core_session_read_frame接口,此接口是读取原始语音流的,在核心中使用,这就是语音流没有单独开线程的原因。
三、media bug相关接口
上一节知道media bug创建,和在media bug回调函数中获取语音流的方法,下面列举一下和media bug相关的一些接口:
- switch_core_media_bug_add --创建media bug
- switch_core_media_bug_remove – 删除media bug
- switch_core_media_bug_get_session – 获取media bug所属的通话session
- switch_core_media_bug_read – 从media bug中读取语音数据
四、完整例子
由于代码比较,完整例子见:https://download.csdn.net/download/xxm524/86261083
(代码示例象征性收取5个积分,如果没有积分可以私信博主即可以免费获取)
自定义模块的使用方法和拨号计划配置见:【FreeSwitch开发实践】自定义模块创建与使用
命令:
originate user/1000 123
输出:

总结
本文主要介绍了media bug相关的知识,分别有如下几3点:
- 说明了什么是media bug
- 如何使用media bug获取通话语音流
- media bug相关接口说明
如果觉得有些帮助或觉得文章还不错,请关注一下博主,你的关注是我持续写作的动力。另外,如果有什么问题,可以在评论区留言,或者私信博主,博主看到后会第一时间回复。
边栏推荐
- STP协议(生成树协议)
- PHP process communication series (I) named pipes
- RestfulAPI——C#——增加header用户名密码验证
- A good-looking IAPP donation list source code
- FTP protocol details
- Unable to start after idea installation
- Thirty years of MPEG audio coding
- PHP lucky draw system with background source code
- sqlilabs less-32~less-33
- 并发模式之生产者消费者模式
猜你喜欢

第09章_性能分析工具的使用

解读AI机器人养宠引领时尚潮流
![[opencv] use OpenCV to call mobile camera](/img/66/6207bafbc9696e43da7a60a386a238.jpg)
[opencv] use OpenCV to call mobile camera

Analysis of Project-based Learning Creativity in steam Education

R language error: compilation failed for package '****‘

STP协议(生成树协议)

Notes on the sixth day

Flink生产环境经典问题汇总

Comic algorithm_ Xiaohuihui interview

Implement encapsulated public method global call in laravel framework
随机推荐
创客教育的起源和内涵的基本理念
groupby 方法
Notes on the ninth day
cuda-gdb提示:/tmp/tmpxft_***.cudafe1.stub.c: No such file or directory.
(job) C language: Simulation Implementation of ATOI and strncpy, strncat, strncmp
TP5.0 小程序用户无需登录,直接获取用户手机号。
vim常用命令
算法---粉刷房子(Kotlin)
自组织是管理者和成员的双向奔赴
Advanced architects, 16 common principles of microservice design and Governance
C语言:小乐乐与欧几里得
12. Writing rules - static mode
会议OA项目之我的审批功能
nacos名字的由来
解析Steam教育中的项目式学习创造力
Asemi rectifier bridge s25vb100, s25vb100 parameters, s25vb100 application
OSPF experiment
Catchadmin practical tutorial (IV) implementation of relevant functions of table components
Family relationship calculator wechat applet source code
php 进程通信系列 (一) 命名管道