我正在用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中的默认声音设备,所以通过这种方式,我创建了一个链接,并获得了一个可以使用的编号。
以下是我所做的:
- 我在"主页"文件夹中创建了".asundrc"文件
- 我抓取了设备的"hw"地址
-
我把下面的代码写进了每个设备的".asundrc"文件:
pcm.plug0 { type plug slave { pcm "hw:0,0" } } pcm.plug1 { type plug slave { pcm "hw:1,0" } }
-
我重复了我使用的第一个代码,得到了这个结果(不同操作系统中的数字可能不同(3:ALSA[plug0](1/1(4:ALSA[插头1](0/0(
-
我使用"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并重建库