所以,我想在 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)
真是痛苦极了,但我终于想通了:
添加了 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) 和所有驱动程序。
我可以知道你还安装了哪些其他东西吗?我尝试在编译之前运行这些命令来为 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()
非常感谢您的帮助,谢谢。