Python - 有没有使用pjsip和python的示例开源项目?

时间:2013-11-30 08:07:28

标签: python centos fedora archlinux pjsip

我在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

1 个答案:

答案 0 :(得分:0)

您的音频问题与我在C - how to resolve this error while using pjsip?中解释的内容有关。有了这个,您应该能够正确地建立呼叫。

另一方面,关于使用pjsippython的项目,我只记得python-sipsimple,但我没有多少经验。

希望这有帮助。