freeswitch-mediabug回调细节
有群友询问如何进行监听和会写媒体。
很多人根据我的文档和文章知道了使用media bug,但是有几个回调有疑虑。
我这边出一个源码的细则,大家便非常清楚了。
类型解释
SWITCH_ABC_TYPE_INIT 初始化
close 关闭这里不再赘述
SWITCH_ABC_TYPE_WRITE_REPLACE:
将读取的进行替换
SWITCH_ABC_TYPE_WRITE_REPLACE:
写出时候,可以进行媒体替换
代码样例
那么你如何进行读取和写出时候进行替换呢? 我们看一部分代码
static switch_bool_t replace_callback(switch_media_bug_t *bug, void *user_data, switch_abc_type_t type)
{
displace_helper_t *dh = (displace_helper_t *) user_data;
switch (type) {
case SWITCH_ABC_TYPE_INIT:
break;
case SWITCH_ABC_TYPE_CLOSE:
break;
case SWITCH_ABC_TYPE_READ_REPLACE:
{
switch_frame_t *rframe = switch_core_media_bug_get_read_replace_frame(bug);
if (dh && !dh->mux) {
memset(rframe->data, 255, rframe->datalen);
}
switch_core_media_bug_set_read_replace_frame(bug, rframe);
}
break;
case SWITCH_ABC_TYPE_WRITE_REPLACE:
if (dh) {
switch_frame_t *rframe = NULL;
switch_size_t len;
switch_status_t st;
rframe = switch_core_media_bug_get_write_replace_frame(bug);
len = rframe->samples;
if (dh->mux) {
int16_t buf[SWITCH_RECOMMENDED_BUFFER_SIZE];
int16_t *fp = rframe->data;
uint32_t x;
} else {
st = switch_core_file_read(&dh->fh, rframe->data, &len);
if (len < rframe->samples) {
memset((char *)rframe->data + (len * 2 * dh->fh.channels), 0, (rframe->samples - len) * 2 * dh->fh.channels);
}
}
……………………
do someting with rframe
……………………
switch_core_media_bug_set_write_replace_frame(bug, rframe);
}
break;
case SWITCH_ABC_TYPE_WRITE:
default:
break;
}
return SWITCH_TRUE;
}
最后总结
read replace 需要两个重要函数
switch_core_media_bug_get_read_replace_frame
switch_core_media_bug_set_read_replace_frame
write replace 需要两个重要函数
switch_core_media_bug_get_write_replace_frame
switch_core_media_bug_set_write_replace_frame
如果还需要了解更深入,可以咨询qq: 2637332218
如果对您有帮助,别吝啬您的star
sip-mrcp
实现sip客户端,进行mrcp交互,能够实现语音转写,智能助手等。
https://github.com/laoyin/java-sip-mrcp