PJSUA在两个或更多不同的音频声卡之间切换

时间:2019-11-16 09:36:53

标签: c++ linux pjsip pjsua2

我正在使用pjsua2进行这个新项目,该项目在计算机上有两个声音设备,我想独立使用它们,但是在linux中,当我插入另一个声卡时,第二个声卡就成为了默认声卡。因此,我无法在第一个声卡上进行传输,因此尝试按此处所述获取音频设备的数量: Audio Device API

来源是:

int dev_count;
pjmedia_aud_dev_index dev_idx;
pj_status_t status;
dev_count = pjmedia_aud_dev_count();
printf("Got %d audio devices\n", dev_count);
for (dev_idx=0; dev_idx<dev_count; ++i) {
 pjmedia_aud_dev_info info;
 status = pjmedia_aud_dev_get_info(dev_idx, &info);
 printf("%d. %s (in=%d, out=%d)\n",
 dev_idx, info.name,
 info.input_count, info.output_count);
}

我得到以下输出:

Got 32 audio devices
0. default (in=1, out=1)
1. jack (in=0, out=0)
2. pulse (in=1, out=1)
3. hdmi:CARD=HDMI,DEV=0 (in=0, out=1)
4. hdmi:CARD=HDMI,DEV=1 (in=0, out=1)
5. hdmi:CARD=HDMI,DEV=2 (in=0, out=1)
6. hdmi:CARD=HDMI,DEV=3 (in=0, out=1)
7. hdmi:CARD=HDMI,DEV=4 (in=0, out=1)
8. dmix:CARD=HDMI,DEV=3 (in=0, out=1)
9. dmix:CARD=HDMI,DEV=7 (in=0, out=1)
10. dmix:CARD=HDMI,DEV=8 (in=0, out=1)
11. dmix:CARD=HDMI,DEV=9 (in=0, out=1)
12. dmix:CARD=HDMI,DEV=10 (in=0, out=1)
13. dsnoop:CARD=HDMI,DEV=3 (in=0, out=0)
14. dsnoop:CARD=HDMI,DEV=7 (in=0, out=0)
15. dsnoop:CARD=HDMI,DEV=8 (in=0, out=0)
16. dsnoop:CARD=HDMI,DEV=9 (in=0, out=0)
17. dsnoop:CARD=HDMI,DEV=10 (in=0, out=0)
18. hw:CARD=HDMI,DEV=3 (in=0, out=1)
19. hw:CARD=HDMI,DEV=7 (in=0, out=1)
20. hw:CARD=HDMI,DEV=8 (in=0, out=1)
21. hw:CARD=HDMI,DEV=9 (in=0, out=1)
22. hw:CARD=HDMI,DEV=10 (in=0, out=1)
23. plughw:CARD=HDMI,DEV=3 (in=0, out=1)
24. plughw:CARD=HDMI,DEV=7 (in=0, out=1)
25. plughw:CARD=HDMI,DEV=8 (in=0, out=1)
26. plughw:CARD=HDMI,DEV=9 (in=0, out=1)
27. plughw:CARD=HDMI,DEV=10 (in=0, out=1)
28. usbstream:CARD=HDMI (in=0, out=0)
29. sysdefault:CARD=PCH (in=0, out=1)
30. front:CARD=PCH,DEV=0 (in=0, out=1)
31. surround21:CARD=PCH,DEV=0 (in=0, out=0)

但是当我拔出第二个音频声卡时,结果是相同的。

是否可以在PJSUA中的两个声卡之间进行切换和选择,然后选择其中一个进行通话?我的项目的目标是使用一个声卡有时进行传输,而在其他时间使用另一种进行语音通话。

PJSUA文档描述了如何获取音频媒体设备,如Here所述,但是当我调用get media size功能时,我总是收到1 !,因此无法在两个声卡之间切换或选择。

3 个答案:

答案 0 :(得分:0)

我知道这个问题是一个月前发布的,但是也许这仍然有用。

据我了解,您的目标与呼叫媒体数量无关。这个告诉您会话中正在运行多少个媒体流-一个,因为您在会话SDP中协商了一个流(“ m”参数)。

PJSUA允许使用pjsua_set_snd_devlink)做您想要的事情(选择本地音频设备)-只需将指定的设备ID作为参数传递即可。

答案 1 :(得分:0)

经过几天的工作和搜索,我找到了一个我真的不记得源链接的解决方案(很抱歉!)。 因此我发现该设备已被“ alsa”检测到,并且可以与声音设备进行交互。

因此,在搜索之后,我发现如果我对该设备进行了插入,则可以从pjsua应用程序中看到该设备并与之交互。

我需要一个设备号才能使其成为pjapplication中的默认声音设备,因此我通过这种方式建立了链接并获得了可以使用的号码。

这就是我所做的:

  1. 我在“ Home”文件夹中创建了“ .asoundrc”文件。
  2. 我抓住了设备的“硬件”地址
  3. 我将以下代码写入每个设备的“ .asoundrc”文件中:

    pcm.plug0 {
       type plug
       slave {
       pcm "hw:0,0"
       }
    }
    
    pcm.plug1 {
       type plug
       slave {
       pcm "hw:1,0"
       }
    }
    
  4. ,我重复了我使用的第一个代码并得到了这个结果(不同操作系统中的数字可能不同) 3:ALSA [plug0](1/1) 4:ALSA [plug1](0/0)

  5. 我使用“ 3”传递pjapplication默认声音。

答案 2 :(得分:0)

PJSUA 2.10 限制了 32 个检测到的 alsa 音频设备 - 如果您查看日志,它会抱怨检测到的设备数量超出了它的处理能力:

audiodev.c ..2 device(s) cannot be registered because there are too many devices

一个简单的解决方法是在 pjmedia/src/pjmedia-audiodev/alsa_dev.c 中增加 MAX_DEVICES 并重建库

相关问题