【FreeSwitch开发实践】media bug获取通话语音流

这篇具有很好参考价值的文章主要介绍了【FreeSwitch开发实践】media bug获取通话语音流。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

🏠 博客主页:小小马车夫的主页
🍅 所属专栏:FreeSwitch开发实践
🥝 专栏介绍:主要介绍博主在实际项目中使用FreeSwitch开发外呼类项目的一些经验心得,主要涉及FreeSwitch的基本安装编译、基本配置、ESL、WSS、录音、自定义模块、media bug、语音播放、MRCP及对接AI机器人等内容。内容在持续更新中,如果感兴趣可以对专栏进行订阅~

🎈🎈想对未来的自己说的话🎈🎈
🥑 🥑 间歇性的努力和蒙混过日子,都是对之前努力的清零🥑 🥑

【FreeSwitch开发实践】media bug获取通话语音流


前言

上一篇介绍创建和使用自定义模块,创建一个自己的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

输出:
【FreeSwitch开发实践】media bug获取通话语音流【FreeSwitch开发实践】media bug获取通话语音流


总结

本文主要介绍了media bug相关的知识,分别有如下几3点:

  • 说明了什么是media bug
  • 如何使用media bug获取通话语音流
  • media bug相关接口说明

如果觉得有些帮助或觉得文章还不错,请关注一下博主,你的关注是我持续写作的动力。另外,如果有什么问题,可以在评论区留言,或者私信博主,博主看到后会第一时间回复。文章来源地址https://www.toymoban.com/news/detail-440099.html

到了这里,关于【FreeSwitch开发实践】media bug获取通话语音流的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • uniapp Vue 使用 sip.js进行语音通话视频通话

    下载或者安装 sip.js 到 uniapp 项目,APP 端在 menifest.json 中配置麦克风权限 menifest.json 中 app 权限配置选中: android.permission.RECORD_AUDIO android.permission.MODIFY_AUDIO_SETTINGS sip.js 低版本 如 V0.13.0 版本的写法 sip.js 高版本如 V0.21.2 用法 (参数同上,只列出 methods 里的部分) APP模式下检测麦

    2024年02月13日
    浏览(52)
  • whatsapp 语音通话 音频编码(五)

    whatsapp 语音通话 音频编码(五)

    客户端通过websocket连接到服务器,客户端发起语音通话请求,并且完成必要的协商之后,就可以直接将语音数据发送给服务器,服务器接收到对方的语音数据之后也会通过websocket将语音数据转发给客户端 XMPP 在发起语音通话请求的时候,需要带上一个秘钥,这个秘钥长32字节

    2024年04月17日
    浏览(21)
  • 智能手表上的音频(四):语音通话

    智能手表上的音频(四):语音通话

    上篇讲了智能手表上音频文件播放。本篇开始讲语音通话。同音频播放一样有两种case:内置codec和BT。先看这两种case下audio data path,分别如下图:                                         内置codec下的语音通话audio data path                       

    2024年02月03日
    浏览(9)
  • WebSocket+Vue+SpringBoot实现语音通话

    WebSocket+Vue+SpringBoot实现语音通话

    参考文章 整体思路 前端点击开始对话按钮后,将监听麦克风,获取到当前的音频,将其装化为二进制数据,通过websocket发送到webscoket服务端,服务端在接收后,将消息写入给指定客户端,客户端拿到发送过来的二进制音频后再转化播放 注意事项 由于音频转化后的二进制数据

    2024年02月06日
    浏览(9)
  • unity 使用声网(Agora)实现语音通话

    unity 使用声网(Agora)实现语音通话

    第一步、先申请一个声网账号 [Agora官网链接](https://console.shengwang.cn/) 第二步在官网创建项目 ,选择无证书模式,证书模式需要tokenh和Appld才能通话 第三步 官网下载SDK 然后导入到unity,也可以直接在unity商店里下载,Agora官网下载链接 第四步 运行官方Demo 1、导入后会有这些

    2024年04月25日
    浏览(14)
  • SIP/VoIP之常见的语音通话问题

      语音通话是SIP或VoIP应用中最重要的功能,一旦语音方面出现问题,将极大的降低产品的口碑,很容易被市场和用户淘汰。   主叫方听不到被叫方声音,被叫方也听不到主叫方声音,即双方互相听不见   其中一方能听见另一方声音   听见对方的声音语调不对,声音

    2023年04月18日
    浏览(10)
  • webRCT实时语音视频通话 结合 vue使用

    前言:最近项目遇到了一个推送视频对话的需求,本身项目就用到了websocket推送,所以直接使用webRCT就行 封装了一个socket.js mounted的中调用connection 就可以了

    2024年02月13日
    浏览(9)
  • web网页端使用webSocket实现语音通话功能(SpringBoot+VUE)

    web网页端使用webSocket实现语音通话功能(SpringBoot+VUE)

    最近在写一个web项目,需要实现web客户端之间的语音通话,期望能够借助webSocket全双工通信的方式来实现,但是网上没有发现可以正确使用的代码。网上能找到的一个代码使用之后 只能听到“嘀嘀嘀”的杂音 解决方案: 使用Json来传递数据代替原有的二进制输入输出流 技术

    2024年02月02日
    浏览(54)
  • AI智能电话语音通话销售机器人源码,附带系统搭建教程

    AI智能电话语音通话销售机器人源码,附带系统搭建教程

    智能电话语音销售机器人——高效筛选与跟进客户的利器 在快节奏的商业战场上,迅速准确地把握每一个潜在客户是企业制胜的关键。我们的智能电话语音销售机器人正是这样一款能够助力企业轻松应对海量客户数据,实现高效筛选与跟进的利器。 通过简单的资料接入,您

    2024年02月21日
    浏览(10)
  • python使用VOSK实现离线语音识别(中文普通话)

    python使用VOSK实现离线语音识别(中文普通话)

    目标:一个代码简单,离线,可直接使用,常用语句准确率还不错,免费的,普通话语音转文本的工具 几番对比下来,VSOK基本满足我的需求,记录一下。 环境 windows 10 / python3.8.10 s1 安装 vosk s2 下载模型 两个模型,一个很小,文件名中带有small字样,另一个就很大了,就我自

    2024年02月11日
    浏览(16)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包