Pjsip如何播放本地wav(python實例)


import sys

import wave

import pjsua as pj

import thread

import _pjsua

from time import sleep

 

LOG_LEVEL=3

current_call = None

C_QUIT = 0

THIS_FILE = "SIPSender.py"

 

# Logging callback

def log_cb(level, str, len):

   print str,

 

 

# Callback to receive events from account

classMyAccountCallback(pj.AccountCallback):

 

   def __init__(self, account):

       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):

       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

 

    #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, arg):

   try:

       global lib

       # register python thread

       thread_desc = 0;

       err = _pjsua.thread_register("python worker", thread_desc)

 

       # make a call

       print "Making call to", uri

       call = acc.make_call(uri)

       call_cb = MyCallCallback(call)

       call.set_callback(call_cb)

 

       # stream wav file

       # calculate wav time

       wfile = wave.open("input.48.wav")

       time = (1.0 * wfile.getnframes ()) / wfile.getframerate ()

       print str(time) + "ms"

       wfile.close()

 

       # stream wav file

       player_id = lib.create_player("input.48.wav")

       print "Wav player id is: ", player_id

       lib.conf_connect(lib.player_get_slot(player_id), call.info().conf_slot)

 

       sleep(time)

       lib.conf_disconnect(lib.player_get_slot(player_id),call.info().conf_slot)

       lib.player_destroy(player_id)

 

   except pj.Error, e:

       print "Error: " + 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),

media_cfg = pj.MediaConfig())

 

    #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()

 

    #Create account config

   acc_conf = pj.AccountConfig()

   acc_conf.build_config("192.168.169.99", "1000","1234", "SIPAgent")

 

    #Create account

   acc = lib.create_account(acc_conf)

   acc_cb = MyAccountCallback(acc)

   acc.set_callback(acc_cb)

 

    #Make a call

    t= thread.start_new_thread(make_call,

("sip:1001 at 192.168.169.99<sip%3A1001 at 192.168.169.99>",

1))

 

   input = sys.stdin.readline().rstrip("\r\n")

    #Shutdown the library

   lib.destroy()

   lib = None

 

except pj.Error, e:

   print "Exception: " + str(e)

   lib.destroy()

   lib = None


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章