问题一:
确定 pjsip 中负责视频渲染的代码位置。通常情况下,视频渲染是通过使用底层的视频渲染库(如 libyuv、ffmpeg 等)来实现的。你需要找到负责将视频帧渲染到屏幕上的代码。
在视频渲染的逻辑中,找到对方视频帧的处理部分。这通常涉及到从接收到的 RTP 数据中提取视频帧,并进行解码和渲染。你需要在这个处理部分进行修改。
在处理对方视频帧的代码中,将对方的视频帧过滤掉。你可以根据自己的需求,将对方视频帧替换为静态图像、黑屏或其他自定义的内容。
编译和测试你的修改。确保你的修改不会破坏其他功能,并且能够正确地去掉对方的视频。
请注意,这只是一个大致的步骤,具体的实现细节可能会因你使用的 pjsip 版本、视频渲染库以及你的自定义需求而有所不同。你需要深入了解 pjsip 的视频渲染逻辑,并根据实际情况进行修改。
另外,pjsip 提供了一些 API 和回调函数,可以让你在视频渲染过程中进行更多的自定义操作。你可以查阅 pjsip 的官方文档和示例代码,以获取更多关于视频渲染的信息。
问题二,在挂断电话之前,你可以使用 pjsua_call_set_setting()
函数来关闭摄像头。具体步骤如下:
在你的 MFC 应用程序中,找到挂断电话的代码位置。
在调用 pjsua_call_hangup()
函数之前,添加以下代码来关闭摄像头:
pjsua_call_setting callSetting;
pjsua_call_get_setting(m_call_id, &callSetting);
// 关闭摄像头
callSetting.flag &= ~PJSUA_CALL_INCLUDE_DEFAULT_AUDIO;
callSetting.flag &= ~PJSUA_CALL_INCLUDE_DEFAULT_VIDEO;
pjsua_call_set_setting(m_call_id, &callSetting);
这段代码会获取当前呼叫的设置,然后将 PJSUA_CALL_INCLUDE_DEFAULT_AUDIO
和 PJSUA_CALL_INCLUDE_DEFAULT_VIDEO
标志位从设置中移除,从而关闭摄像头。
pjsua_call_hangup()
函数来挂断电话:pjsua_call_hangup(m_call_id, 0, NULL, NULL);
你好,pjsua_call_setting pjsua_call_get_setting PJSUA_CALL_INCLUDE_DEFAULT_AUDIO PJSUA_CALL_INCLUDE_DEFAULT_VIDEO pjsua_call_set_setting 在我下载的pjproject库中都找不到,pjsip和pjproject不一样吗
@哈哈哈划横: 之前给出的代码片段中使用的函数和标志位是基于 pjsua2 库的,而你可能正在使用 pjsua 库。pjsua 和 pjsua2 是 pjsip 提供的两个不同的 API,它们有一些不同的函数和标志位。
如果你使用的是 pjsua 库,你可以使用以下方法来关闭摄像头:
在你的 MFC 应用程序中,找到挂断电话的代码位置。
在调用 pjsua_call_hangup()
函数之前,添加以下代码来关闭摄像头:
pjsua_call_info callInfo;
pjsua_call_get_info(m_call_id, &callInfo);
// 关闭摄像头
pjsua_call_vid_set_stream(m_call_id, callInfo.media[0].index, PJMEDIA_DIR_NONE);
这段代码会获取当前呼叫的信息,然后使用 pjsua_call_vid_set_stream()
函数将视频流的方向设置为 PJMEDIA_DIR_NONE
,从而关闭摄像头。
pjsua_call_hangup()
函数来挂断电话:pjsua_call_hangup(m_call_id, 0, NULL, NULL);
@lanedm:
pjsua_call_vid_set_stream()也找不到
我下载的源代码是官网转到GitHub下载,最新的,是我下载的版本有问题吗,之前我也上网搜索了,也给了一些函数,在我下载的源代码中就是找不到
@哈哈哈划横: 试试这个,通过修改呼叫的 SDP(Session Description Protocol)来关闭摄像头:
pjsua_call_info callInfo;
pjsua_call_get_info(m_call_id, &callInfo);
// 获取呼叫的 SDP
pjmedia_sdp_session *sdp = callInfo.media[0].media.sdp;
// 遍历 SDP 中的媒体行
pjmedia_sdp_media *media;
PJ_LIST_FOREACH(media, &sdp->media) {
// 找到视频媒体行
if (media->desc->media_type == PJMEDIA_TYPE_VIDEO) {
// 删除视频媒体行
pj_list_erase(&media->node);
pj_pool_release(media);
break;
}
}
// 更新呼叫的 SDP
pjsua_call_set_media(m_call_id, &callInfo.media[0].media);
@lanedm: 还是不行,callInfo.media[0].media.sdp;//pjmedia_sdp_session没有media成员
PJ_LIST_FOREACH //未定义标志符
pjsua_call_set_media //找不到
pj_list_erase pj_pool_release// 能找到
大佬,你再帮忙看看
@哈哈哈划横: 这个开源项目不提供关闭摄像头的方法,那就没办法了,你在源码里面再找一下看看,必须关闭摄像头才能挂断电话
@lanedm: 应该有的,我用MicroSIP 的源码编译调用的库就是pjproject,我的dome模仿它的,能打开关闭摄像头,可我就是找不到在哪,通过调试,点击挂断电话按钮,它是在(点击挂断电话按钮)的函数完整运行结束后才关闭的摄像头
我找到了,是这个pjsua_vid_preview_stop(widx); 谢谢你
@lanedm: 我找到了,是这个pjsua_vid_preview_stop(widx); 谢谢你