我在CentOS,Fedora,ArchLinux,Ubuntu中尝试使用Python 2.7.3进行pjsip - sip注册 - sip音频编解码器编码/解码 - 媒体访问麦克风,扬声器输出 - 网络眩晕,转
直到现在我已经编写了以下代码,它可以注册sip,拨打电话保持连接状态。
但问题是我无法捕获麦克风并在扬声器中听音频失败。所以我正在寻找一些稳定的工作样本,如果有的话。任何人都可以建议吗?
import sys
import pjsua as pj
LOG_LEVEL=3
current_call = None
def log_cb(level, str, len):
print str,
class MyAccountCallback(pj.AccountCallback):
def __init__(self, account=None):
pj.AccountCallback.__init__(self, account)
# Notification on incoming call
def on_incoming_call(self, call):
global current_call
if current_call:
call.answer(486, "Busy")
return
print "Incoming call from ", call.info().remote_uri
print "Press 'a' to answer"
current_call = call
call_cb = MyCallCallback(current_call)
current_call.set_callback(call_cb)
current_call.answer(180)
# Callback to receive events from Call
class MyCallCallback(pj.CallCallback):
def __init__(self, call=None):
pj.CallCallback.__init__(self, call)
# Notification when call state has changed
def on_state(self):
global current_call
print "Call with", self.call.info().remote_uri,
print "is", self.call.info().state_text,
print "last code =", self.call.info().last_code,
print "(" + self.call.info().last_reason + ")"
if self.call.info().state == pj.CallState.DISCONNECTED:
current_call = None
print 'Current call is', current_call
# Notification when call's media state has changed.
def on_media_state(self):
if self.call.info().media_state == pj.MediaState.ACTIVE:
# Connect the call to sound device
call_slot = self.call.info().conf_slot
pj.Lib.instance().conf_connect(call_slot, 0)
pj.Lib.instance().conf_connect(0, call_slot)
print "Media is now active"
else:
print "Media is inactive"
# Function to make call
def make_call(uri):
try:
print "Making call to", uri
return acc.make_call(uri, cb=MyCallCallback())
except pj.Error, e:
print "Exception: " + str(e)
return None
# Create library instance
lib = pj.Lib()
try:
# Init library with default config and some customized
# logging config.
lib.init(log_cfg = pj.LogConfig(level=LOG_LEVEL, callback=log_cb))
# Create UDP transport which listens to any available port
transport = lib.create_transport(pj.TransportType.UDP,
pj.TransportConfig(0))
print "\nListening on", transport.info().host,
print "port", transport.info().port, "\n"
# Start the library
lib.start()
# when no sound card found
lib.set_null_snd_dev() # here is the problem i cant capture mic, speaker from local system
# Create local account
#acc = lib.create_account_for_transport(transport, cb=MyAccountCallback())
acc = lib.create_account(pj.AccountConfig("192.168.1.12", "abc", "admin2013"))
cb = MyAccountCallback(acc)
acc.set_callback(cb)
#cb.wait()
print "\n"
print "Registration complete, status=", acc.info().reg_status, \
"(" + acc.info().reg_reason + ")"
# If argument is specified then make call to the URI
if len(sys.argv) > 1:
lck = lib.auto_lock()
current_call = make_call(sys.argv[1])
print 'Current call is', current_call
del lck
my_sip_uri = "sip:" + transport.info().host + \
":" + str(transport.info().port)
# Menu loop
while True:
print "My SIP URI is", my_sip_uri
print "Menu: m=make call, h=hangup call, a=answer call, q=quit"
input = sys.stdin.readline().rstrip("\r\n")
if input == "m":
if current_call:
print "Already have another call"
continue
print "Enter destination URI to call: ",
input = sys.stdin.readline().rstrip("\r\n")
if input == "":
continue
lck = lib.auto_lock()
current_call = make_call(input)
del lck
elif input == "h":
if not current_call:
print "There is no call"
continue
current_call.hangup()
elif input == "a":
if not current_call:
print "There is no call"
continue
current_call.answer(200)
elif input == "q":
break
# Shutdown the library
transport = None
acc.delete()
acc = None
lib.destroy()
lib = None
except pj.Error, e:
print "Exception: " + str(e)
lib.destroy()
lib = None
答案 0 :(得分:0)
您的音频问题与我在C - how to resolve this error while using pjsip?中解释的内容有关。有了这个,您应该能够正确地建立呼叫。
另一方面,关于使用pjsip
和python
的项目,我只记得python-sipsimple,但我没有多少经验。
希望这有帮助。