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



我正在用pjsua2做这个新项目,它在计算机上有两个声音设备,我想独立使用它们,但在linux中,当我插入另一个声卡时,第二个声卡变成了默认声卡。所以我无法在第一张声卡上传输,我试图获得音频设备的数量,如下所述:音频设备API

来源是:

int dev_count;
pjmedia_aud_dev_index dev_idx;
pj_status_t status;
dev_count = pjmedia_aud_dev_count();
printf("Got %d audio devicesn", 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文档描述了如何获得此处所述的音频媒体设备,但当我调用获取媒体大小函数时,我总是收到1!,因此我不能在我的两个声卡之间切换或选择。

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

据我所知,你的目标与呼叫媒体数量无关。这个告诉你有多少媒体流在会话一中运行,因为你在会话SDP中协商了一个流("m"参数(。

PJSUA允许使用pjsua_set_snd_dev(链接(执行您想要的操作(选择本地音频设备(-只需将指定的设备ID作为参数传递即可。

经过几天的工作和搜索,我发现了一个我真的不记得源链接的解决方案(很抱歉!(。所以我发现设备已经被"alsa"检测到,我可以与声音设备交互。

所以在搜索之后,我发现如果我插入该设备,我可以从我的pjsua应用程序中看到该设备并与之交互。

我需要一个设备编号,使其成为pjaapplication中的默认声音设备,所以通过这种方式,我创建了一个链接,并获得了一个可以使用的编号。

以下是我所做的:

  1. 我在"主页"文件夹中创建了".asundrc"文件
  2. 我抓取了设备的"hw"地址
  3. 我把下面的代码写进了每个设备的".asundrc"文件:

    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[插头1](0/0(

  5. 我使用"3"来传递pjapplication默认声音。

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

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

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

最新更新