首页 新闻 会员 周边

pjsip自写视频软电话软电话

0
悬赏园豆:5 [已解决问题] 解决于 2023-08-23 14:29

现在还有两个问题我无法解决,一个是pjproject内置的对方视频去掉,我从流中间接出一份输出,另一个问题是自己的摄像头被打开后,挂断电话不能关闭摄像头

挂断电话用的是这个函数pjsua_call_hangup(m_call_id, 0, NULL, NULL);

求大佬帮忙解决一下

哈哈哈划横的主页 哈哈哈划横 | 初学一级 | 园豆:5
提问于:2023-08-23 10:04
< >
分享
最佳答案
0

问题一:

  1. 确定 pjsip 中负责视频渲染的代码位置。通常情况下,视频渲染是通过使用底层的视频渲染库(如 libyuv、ffmpeg 等)来实现的。你需要找到负责将视频帧渲染到屏幕上的代码。

  2. 在视频渲染的逻辑中,找到对方视频帧的处理部分。这通常涉及到从接收到的 RTP 数据中提取视频帧,并进行解码和渲染。你需要在这个处理部分进行修改。

  3. 在处理对方视频帧的代码中,将对方的视频帧过滤掉。你可以根据自己的需求,将对方视频帧替换为静态图像、黑屏或其他自定义的内容。

  4. 编译和测试你的修改。确保你的修改不会破坏其他功能,并且能够正确地去掉对方的视频。

请注意,这只是一个大致的步骤,具体的实现细节可能会因你使用的 pjsip 版本、视频渲染库以及你的自定义需求而有所不同。你需要深入了解 pjsip 的视频渲染逻辑,并根据实际情况进行修改。

另外,pjsip 提供了一些 API 和回调函数,可以让你在视频渲染过程中进行更多的自定义操作。你可以查阅 pjsip 的官方文档和示例代码,以获取更多关于视频渲染的信息。

问题二,在挂断电话之前,你可以使用 pjsua_call_set_setting() 函数来关闭摄像头。具体步骤如下:

  1. 在你的 MFC 应用程序中,找到挂断电话的代码位置。

  2. 在调用 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_AUDIOPJSUA_CALL_INCLUDE_DEFAULT_VIDEO 标志位从设置中移除,从而关闭摄像头。

  1. 最后,调用 pjsua_call_hangup() 函数来挂断电话:
pjsua_call_hangup(m_call_id, 0, NULL, NULL);
收获园豆:5
lanedm | 老鸟四级 |园豆:2378 | 2023-08-23 10:15

你好,pjsua_call_setting pjsua_call_get_setting PJSUA_CALL_INCLUDE_DEFAULT_AUDIO PJSUA_CALL_INCLUDE_DEFAULT_VIDEO pjsua_call_set_setting 在我下载的pjproject库中都找不到,pjsip和pjproject不一样吗

哈哈哈划横 | 园豆:5 (初学一级) | 2023-08-23 10:34

@哈哈哈划横: 之前给出的代码片段中使用的函数和标志位是基于 pjsua2 库的,而你可能正在使用 pjsua 库。pjsua 和 pjsua2 是 pjsip 提供的两个不同的 API,它们有一些不同的函数和标志位。

如果你使用的是 pjsua 库,你可以使用以下方法来关闭摄像头:

  1. 在你的 MFC 应用程序中,找到挂断电话的代码位置。

  2. 在调用 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,从而关闭摄像头。

  1. 最后,调用 pjsua_call_hangup() 函数来挂断电话:
pjsua_call_hangup(m_call_id, 0, NULL, NULL);
lanedm | 园豆:2378 (老鸟四级) | 2023-08-23 10:35

@lanedm:
pjsua_call_vid_set_stream()也找不到
我下载的源代码是官网转到GitHub下载,最新的,是我下载的版本有问题吗,之前我也上网搜索了,也给了一些函数,在我下载的源代码中就是找不到

哈哈哈划横 | 园豆:5 (初学一级) | 2023-08-23 10:47

@哈哈哈划横: 试试这个,通过修改呼叫的 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 | 园豆:2378 (老鸟四级) | 2023-08-23 10:50

@lanedm: 还是不行,callInfo.media[0].media.sdp;//pjmedia_sdp_session没有media成员
PJ_LIST_FOREACH //未定义标志符
pjsua_call_set_media //找不到
pj_list_erase pj_pool_release// 能找到
大佬,你再帮忙看看

哈哈哈划横 | 园豆:5 (初学一级) | 2023-08-23 10:58

@哈哈哈划横: 这个开源项目不提供关闭摄像头的方法,那就没办法了,你在源码里面再找一下看看,必须关闭摄像头才能挂断电话

lanedm | 园豆:2378 (老鸟四级) | 2023-08-23 11:06

@lanedm: 应该有的,我用MicroSIP 的源码编译调用的库就是pjproject,我的dome模仿它的,能打开关闭摄像头,可我就是找不到在哪,通过调试,点击挂断电话按钮,它是在(点击挂断电话按钮)的函数完整运行结束后才关闭的摄像头

哈哈哈划横 | 园豆:5 (初学一级) | 2023-08-23 11:13

我找到了,是这个pjsua_vid_preview_stop(widx); 谢谢你

哈哈哈划横 | 园豆:5 (初学一级) | 2023-08-23 14:28

@lanedm: 我找到了,是这个pjsua_vid_preview_stop(widx); 谢谢你

哈哈哈划横 | 园豆:5 (初学一级) | 2023-08-23 14:28
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册