PJSUA视频通话



我使用pjsua创建一个从监视器到电话的视频通话。我能够建立一个音频通话没有问题,但如果我试图建立一个视频通话(vid_cnt=1),我得到一个错误。

我的目的是获取并保存手机的音频和视频。

这是我的配置:

void hard_account_config(pjsua_acc_config& acc_cfg, pjsua_transport_id transport_tcp) {
pjsua_acc_config_default(&acc_cfg);

acc_cfg.ka_interval = 15;
// VIDEO
acc_cfg.vid_in_auto_show = PJ_TRUE;
acc_cfg.vid_out_auto_transmit = PJ_TRUE;
acc_cfg.vid_cap_dev = VideoCaptureDeviceId();
acc_cfg.vid_wnd_flags = PJMEDIA_VID_DEV_WND_BORDER | PJMEDIA_VID_DEV_WND_RESIZABLE;
acc_cfg.reg_timeout = 300;
acc_cfg.use_srtp = PJMEDIA_SRTP_DISABLED;
pjsua_srtp_opt_default(&acc_cfg.srtp_opt);
acc_cfg.ice_cfg_use = PJSUA_ICE_CONFIG_USE_CUSTOM;
acc_cfg.ice_cfg.enable_ice = PJ_FALSE;
acc_cfg.allow_via_rewrite = PJ_FALSE;
acc_cfg.allow_sdp_nat_rewrite = acc_cfg.allow_via_rewrite;
acc_cfg.allow_contact_rewrite = acc_cfg.allow_via_rewrite ? 2 : PJ_FALSE;
acc_cfg.publish_enabled = PJ_TRUE;

acc_cfg.transport_id = transport_tcp;
acc_cfg.cred_count = 1;
acc_cfg.cred_info[0].username = pj_string(USER);
acc_cfg.cred_info[0].realm = pj_string("*");
acc_cfg.cred_info[0].scheme = pj_string("Digest");
acc_cfg.cred_info[0].data_type = PJSIP_CRED_DATA_PLAIN_PASSWD;
acc_cfg.cred_info[0].data = pj_string(PASS);
}

注册完成后,运行以下代码:

prn("=== Test Call ===");
pj_str_t uri = pj_string("sip:" + call_target + "@" + SERVER);
pjsua_call_id call_id;
pjsua_call_setting call_setting;
pjsua_call_setting_default(&call_setting);
call_setting.flag = 0;
call_setting.vid_cnt = PJMEDIA_HAS_VIDEO ? 1 : 0;
pjsua_msg_data msg_data;
pjsua_msg_data_init(&msg_data);
pj_status_t status = pjsua_call_make_call(acc_id, &uri, &call_setting, NULL, &msg_data, &call_id);
if (status != PJ_SUCCESS) { 
prn("Error trying: pjsua_call_make_call"); 
return;
}

我知道PJMEDIA_HAS_VIDEO在conf_site.h上等于1,pjsua_call_make_call返回PJ_SUCCESS.

我看到如果我有耳机连接,没有问题。但是如果我断开它们,则显示以下错误:#pjsua_aud.c ..Error retrieving default audio device parameters: Unable to find default audio device (PJMEDIA_EAUD_NODEFDEV) [status=420006]如果我连接耳机,启用视频并运行代码,则显示以下错误:#pjsua_media.c ......pjsua_vid_channel_update() failed for call_id 0 media 1: Unable to find default video device (PJMEDIA_EVID_NODEFDEV)

所以,使用PJSUA有必要在显示器和手机上安装音频和视频设备吗?如果我没有设备,我应该创建虚拟端口吗?

您可以使用以下代码获取PJSUA中的音频/视频设备列表,该列表很可能为您提供一个环回设备(以及其他设备)。

pjmedia_aud_dev_info audio_device[64];
unsigned int audio_device_cnt = 64;
status = pjsua_enum_aud_devs(audio_device, &audio_device_cnt);
printf("There are %d audio devicesn", audio_device_cnt);
for (int i = 0; i < audio_device_cnt; i++) {
printf("%d: %sn", i, audio_device[i].name);
}
pjmedia_vid_dev_info video_device[64];
unsigned int video_device_cnt = 64;
status = pjsua_vid_enum_devs(video_device, &video_device_cnt);
printf("There are %d video devicesn", video_device_cnt);
for (int i = 0; i < video_device_cnt; i++) {
printf("%d: %sn", i, video_device[i].name);
}

我个人没有尝试过捕获环回音频设备,但对于视频,PJSUA提供了一个内部颜色条生成器(Colorbar generator在这个列表中),您可以使用。

找到要使用的环回或虚拟音频/视频设备的索引后,可以使用

设置它们
pjsua_set_snd_dev(<YOUR DUMMY CAPTURE DEVICE>, <YOUR DUMMY PLAYBACK DEVICE>);   
acc_cfg.vid_cap_dev = <YOUR VIDEO CAPTURE DEVICE>;

最新更新