0

我正在使用 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 文档描述了如何按照此处所述获取音频媒体设备,但是当我调用获取媒体大小功能时,我总是收到 1!,因此我无法在两个声卡之间切换或选择。

4

3 回答 3

0

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

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

pjsua_set_snd_devPJSUA 允许使用( link )做你想做的事情(选择本地音频设备) - 只需将指定的设备 ID 作为参数传递。

于 2019-12-17T14:19:30.570 回答
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 并重建库

于 2021-02-15T20:27:13.103 回答
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默认声音。

于 2020-01-05T07:00:34.360 回答