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

GitHub - laoyin/java-sip-mrcp: java版本的mrcp服务,实现sip、mrcp等协议,实现实时语音流处理、回调等。
java版本的mrcp服务,实现sip、mrcp等协议,实现实时语音流处理、回调等。. Contribute to laoyin/java-sip-mrcp development by creating an account on GitHub.