【问题标题】:PJSUA changing between two or more different audio sound cardsPJSUA 在两个或多个不同的声卡之间切换
【发布时间】:2019-11-16 09:36:53
【问题描述】:

我正在使用 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 所述,但是当我调用获取媒体大小功能时,我总是收到 1!,因此我无法在我的两个声卡之间切换或选择。

【问题讨论】:

  • 您的 GNU/Linux 是否检测到该卡?尝试使用aplay -l 检查是否已连接。使用 USB 外置声卡只需连接即可。如果您安装了 alsa-utils 软件包,则此命令可用。

标签: c++ linux pjsip pjsua2


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    所以在搜索之后,我发现如果我为那个设备做了一个插件,我可以从我的 pjsua 应用程序中看到设备并与之交互。

    我需要一个设备号来使其成为 pjapplication 中的默认声音设备,因此我创建了一个链接并获得了一个可以使用的号码。

    这就是我所做的:

    1. 我在“Home”文件夹中创建了“.asoundrc”文件。
    2. 我抓取了设备“hw”地址
    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默认声音。

    【讨论】:

      【解决方案3】:

      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 并重建库

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-06-23
        • 2011-08-12
        相关资源
        最近更新 更多