?? 博客主頁(yè):小小馬車夫的主頁(yè)
?? 所屬專欄:FreeSwitch開發(fā)實(shí)踐
?? 專欄介紹:主要介紹博主在實(shí)際項(xiàng)目中使用FreeSwitch開發(fā)外呼類項(xiàng)目的一些經(jīng)驗(yàn)心得,主要涉及FreeSwitch的基本安裝編譯、基本配置、ESL、WSS、錄音、自定義模塊、media bug、語(yǔ)音播放、MRCP及對(duì)接AI機(jī)器人等內(nèi)容。內(nèi)容在持續(xù)更新中,如果感興趣可以對(duì)專欄進(jìn)行訂閱~????想對(duì)未來的自己說的話?????? ?? 間歇性的努力和蒙混過日子,都是對(duì)之前努力的清零?? ??
前言
上一篇介紹創(chuàng)建和使用自定義模塊,創(chuàng)建一個(gè)自己的app嵌入到FreeSwitch;這一篇介紹運(yùn)用“media bug”,獲取通話語(yǔ)音流。首先,看到這兒,應(yīng)該會(huì)有兩個(gè)問題:
- 什么是media bug
- media bug有什么用,能干什么
第一個(gè)問題我們放到后面詳細(xì)介紹,第二個(gè)問題media bug能干什么,media bug主要用來監(jiān)聽通話語(yǔ)音數(shù)據(jù),而拿到通話語(yǔ)音流了可以做很多事情,可以加不少業(yè)務(wù): - 通話監(jiān)聽
- 分析語(yǔ)音,即通常說的ASR(語(yǔ)音識(shí)別)
一、什么是media bug
media bug中的bug并不是軟件缺陷的意思,它的作用是在FreeSwitch媒體通話數(shù)據(jù)流(語(yǔ)音或視頻)中截取這部分?jǐn)?shù)據(jù)流,達(dá)到監(jiān)聽的作用,類似從一個(gè)管道安插一個(gè)管道,這個(gè)管道就是“media bug”, 相當(dāng)于打一個(gè)“洞”,所以media bug的bug應(yīng)該稱為“盜取”、“截取”的意思。
二、如何使用media bug獲取通話語(yǔ)音流
首先,看一段media bug創(chuàng)建和獲取通話語(yǔ)音流的例子:
2.1 media bug創(chuàng)建
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);
函數(shù)說明:
參數(shù) | 解釋 |
---|---|
session | 會(huì)話session |
function | media bug函數(shù)名稱,可以作為唯一key,一個(gè)key對(duì)應(yīng)一個(gè)media bug, 對(duì)應(yīng)Media-Bug-Function |
target | 目標(biāo),對(duì)應(yīng)Media-Bug-Taget |
callback | media bug回調(diào)函數(shù) |
user_data | 回調(diào)函數(shù)的傳入數(shù)據(jù) |
stop_time | 停止時(shí)間 |
flags | 標(biāo)志,不標(biāo)志,回調(diào)函數(shù)中監(jiān)聽不通的功能 |
new_bug | 傳出參數(shù), 新創(chuàng)建media bug |
2.2 media bug回調(diào)函數(shù)
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這里就是語(yǔ)音流獲取的地方,
switch_core_media_bug_read
即獲取語(yǔ)音數(shù)據(jù)的接口,下面看下這個(gè)接口的聲明:
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);
這個(gè)接口參數(shù)比較簡(jiǎn)單, bug
就是media bug指針, frame
是語(yǔ)音數(shù)據(jù)結(jié)構(gòu)體
2.3 media bug的原理
這里不展開說明media bug的底層實(shí)現(xiàn),只是簡(jiǎn)要說一下media bug 的實(shí)現(xiàn)。要想了解media bug可以從接口switch_core_media_bug_add
入手,其實(shí)media bug并沒有開起新線程, 從源碼得知只是視頻video會(huì)開線程,而音頻不會(huì),那它是如何監(jiān)聽音頻流呢,答案是switch_core_session_read_frame
接口,此接口是讀取原始語(yǔ)音流的,在核心中使用,這就是語(yǔ)音流沒有單獨(dú)開線程的原因。
三、media bug相關(guān)接口
上一節(jié)知道m(xù)edia bug創(chuàng)建,和在media bug回調(diào)函數(shù)中獲取語(yǔ)音流的方法,下面列舉一下和media bug相關(guān)的一些接口:
- switch_core_media_bug_add --創(chuàng)建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中讀取語(yǔ)音數(shù)據(jù)
四、完整例子
由于代碼比較多,完整例子見:https://download.csdn.net/download/xxm524/86261083
(代碼示例象征性收取5個(gè)積分,如果沒有積分可以私信博主即可以免費(fèi)獲取)
自定義模塊的使用方法和撥號(hào)計(jì)劃配置見:【FreeSwitch開發(fā)實(shí)踐】自定義模塊創(chuàng)建與使用
命令:
originate user/1000 123
輸出:
總結(jié)
本文主要介紹了media bug相關(guān)的知識(shí),分別有如下幾3點(diǎn):文章來源:http://www.zghlxwxcb.cn/news/detail-440099.html
- 說明了什么是media bug
- 如何使用media bug獲取通話語(yǔ)音流
- media bug相關(guān)接口說明
如果覺得有些幫助或覺得文章還不錯(cuò),請(qǐng)關(guān)注一下博主,你的關(guān)注是我持續(xù)寫作的動(dòng)力。另外,如果有什么問題,可以在評(píng)論區(qū)留言,或者私信博主,博主看到后會(huì)第一時(shí)間回復(fù)。文章來源地址http://www.zghlxwxcb.cn/news/detail-440099.html
到了這里,關(guān)于【FreeSwitch開發(fā)實(shí)踐】media bug獲取通話語(yǔ)音流的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!