如何在通话中发送音频文件

问题描述 投票:0回答:2

所以,我想在 pjsua2 python 库中拨打电话,并在应答后附上音频,但在确认呼叫后似乎无法正常工作。

这不起作用:

class Call(pj.Call):
    def __init__(self, acc):
        pj.Call.__init__(self, acc)

    def onCallMediaState(self, prm):
        print("Call media state changed")
        ci = self.getInfo()

        if ci.state == pj.PJSIP_INV_STATE_CONFIRMED:
            print("Call is confirmed, starting audio playback")
            player = pj.AudioMediaPlayer()
            player.createPlayer("/root/audio.wav")
            aud_med = self.getAudioMedia(-1)
            player.startTransmit(aud_med)

但是当我在通话一段时间(3 - 4 秒)后运行它时,这是有效的:

player = pj.AudioMediaPlayer()
player.createPlayer("/root/audio.wav", pj.PJMEDIA_FILE_NO_LOOP)
aud_med = call.getAudioMedia(-1)
player.startTransmit(aud_med)

这是我的完整代码:

import pjsua2 as pj

ep_cfg = pj.EpConfig()
ep = pj.Endpoint()
ep.libCreate()
ep.libInit(ep_cfg)
ep_cfg.uaConfig.threadCnt = 0

sipTpConfig = pj.TransportConfig()
sipTpConfig.port = 5060
tp = ep.transportCreate(pj.PJSIP_TRANSPORT_UDP, sipTpConfig)
ep.libStart()

acfg = pj.AccountConfig()

acfg.idUri = "caller_id <sip:[email protected]>"
acfg.regConfig.registrarUri = "sip:sip.example.com"

acfg.sipConfig.authCreds.append(pj.AuthCredInfo("digest", "*", "username", 0, "password"))

# Create the account
acc = pj.Account()

acc.create(acfg)

call = pj.Call(acc)
prm = pj.CallOpParam(True)

call.makeCall('sip:[email protected]', prm)
sip pjsip pjsua2
2个回答
0
投票

真是痛苦极了,但我终于想通了:

添加了 self.player = None

显然您需要在类级别或其他持久范围中存储对玩家对象的引用。

class Call(pj.Call):
    def __init__(self, acc):
        pj.Call.__init__(self, acc)
        self.player = None

    def onCallMediaState(self, prm):
        print("Call media state changed")
        ci = self.getInfo()

        if ci.state == pj.PJSIP_INV_STATE_CONFIRMED:
            print("Call is confirmed, starting audio playback")
            self.player = pj.AudioMediaPlayer()  # Use the class level attribute
            self.player.createPlayer("/root/audio.wav", pj.PJMEDIA_FILE_NO_LOOP)
            aud_med = self.getAudioMedia(-1)
            self.player.startTransmit(aud_med)

对于任何陷入困境的人,请确保在 Linux 上安装虚拟声卡 (snd-dummy) 和所有驱动程序。


0
投票

我可以知道你还安装了哪些其他东西吗?我尝试在编译之前运行这些命令来为 pjsip 提供 ALSA,而且 我没有专门的音频硬件,但我听说 PulseAudio 有 ALSA 的模拟,我只是无法让它工作。

sudo apt-get install libasound2 libasound2-dev
sudo apt-get install pulseaudio jackd2 alsa-utils dbus-x11

但我刚刚收到此错误:

call.cpp  pjsua_call_make_call(acc.getId(), &pj_dst_uri, param.p_opt, this, param.p_msg_data, &id) error: Unable to find default audio device (PJMEDIA_EAUD_NODEFDEV) (status=420006) [../src/pjsua2/call.cpp:706]
Traceback (most recent call last):
  File "call_test.py", line 54, in <module>
    call.makeCall('sip:52*******@ip.address.here', param)
  File "/home/ubuntu/pjtest/pjsua2_env/lib/python3.8/site-packages/pjsua2.py", line 6040, in makeCall
    return _pjsua2.Call_makeCall(self, dst_uri, prm)
pjsua2.Error

我发现通过在 libInit 之后将音频设备设置为空,调用确实发生了,但它对我不起作用,因为我无法播放音频。

endpoint.libInit(endpoint_config)
endpoint.audDevManager().setNullDev()

非常感谢您的帮助,谢谢。

© www.soinside.com 2019 - 2024. All rights reserved.