Как сделать чтобы скрипт не выбивало?

Есть скрипт, который работает с SIP websockets. В момент принятия звонка вызываю dll библиотеку, написанную на GO она принимает строку и возвращает строку, но в фоне создает соединение webrtc и пишет данные в файл по окончанию в теории просто ничего не должно происходить, но python скрипт закрываться с сообщением типа "2022/07/18 23:57:26 EOF"

import ctypes
library = ctypes.CDLL(os.path.join(os.path.abspath('.'), r'./lib.dll'))
################################
RecordCall = library.RecordCall
RecordCall.argtypes = [ctypes.c_char_p,ctypes.c_char_p]
RecordCall.restype = ctypes.c_char_p
################################

isFileReading = library.isFileReading

isFileReading.restype = ctypes.c_int

StopRecord = library.StopRecord

def on_message(self,ws,message):
        payload = parsersip.SipMessage.from_string(message)
        if hasattr(payload,"reason"):
            if payload.reason.lower() == "unauthorized":
                
        elif hasattr(payload,"method"):
            if payload.method.upper() == "INVITE":

                isfread = isFileReading()

                if isfread:
                    pkg = self.sip.make_cancel_sip_packet()

                pkg = self.sip.make_trying_sip_packet(payload)
                ws.send(pkg)
                
                pkg = self.sip.make_ringing_sip_packet(payload)
                ws.send(pkg)

               ######################################################
                answer = RecordCall( 
                    payload.content.encode("utf-8"),
                    (
                        payload.uri.split(":")[1].split("@")[0] + "." +\
                        str(int(time.time()))
                    ).encode("utf-8")
                )
            #######################################################

                # convert our byte array to a string
                answer_string = answer.decode('utf-8')  
                
                

                pkg = self.sip.make_accept_sip_packet(payload,answer_string)
                ws.send(pkg)

Библиотека
func RecordCall(sdpofferC *C.char, filenameC *C.char) *C.char {
	sdpoffer := C.GoString(sdpofferC)
	filename := C.GoString(filenameC)

	if fileRecording {
		return C.CString("false")
	}

	mediaEngine := webrtc.MediaEngine{}

	if err := mediaEngine.RegisterCodec(webrtc.RTPCodecParameters{
		RTPCodecCapability: webrtc.RTPCodecCapability{MimeType: webrtc.MimeTypeOpus, ClockRate: 48000},
		PayloadType:        111,
	}, webrtc.RTPCodecTypeAudio); err != nil {
		panic(err)
	}

	i := &interceptor.Registry{}
	if err := webrtc.RegisterDefaultInterceptors(&mediaEngine, i); err != nil {
		panic(err)
	}

	api := webrtc.NewAPI(webrtc.WithMediaEngine(&mediaEngine), webrtc.WithInterceptorRegistry(i))
	config := webrtc.Configuration{
		ICEServers: []webrtc.ICEServer{},
		ICETransportPolicy: webrtc.ICETransportPolicyRelay,
	}
	peerConnection, err := api.NewPeerConnection(config)
	if err != nil {
		panic(err)
	}

	peerConnection.OnICEConnectionStateChange(func(connectionState webrtc.ICEConnectionState) {
		if connectionState == webrtc.ICEConnectionStateFailed || connectionState == webrtc.ICEConnectionStateDisconnected {

			StopRecord()
//////////////////////// Я так понимаю что после peerConnection.Close() ошибка
			peerConnection.Close()

		}
		fmt.Printf(">>> OnICEConnectionStateChange: %s <<<\n", connectionState.String())
	})

	peerConnection.OnTrack(func(track *webrtc.TrackRemote, _ *webrtc.RTPReceiver) {
		var err error
		oggFile, err = oggwriter.New(fmt.Sprintf("%s%s", filename, ".ogg"), 48000, 2)
		if err != nil {
			panic(err)
		}

		defer func() {
			fileRecording = false
			oggFile.Close()
		}()
		for {
			rtp, _, err := track.ReadRTP()
			if err != nil {
				log.Fatal(err)
			}
			if err := oggFile.WriteRTP(rtp); err != nil {
				panic(err)
			}
		}

	})

	if _, err = peerConnection.AddTransceiverFromKind(webrtc.RTPCodecTypeAudio); err != nil {
		panic(err)
	}

	offer := webrtc.SessionDescription{
		Type: webrtc.SDPTypeOffer,
		SDP:  patchFreeSwitchSDP(sdpoffer),
	}
	err = peerConnection.SetRemoteDescription(offer)
	if err != nil {
		panic(err)
	}

	gatherComplete := webrtc.GatheringCompletePromise(peerConnection)

	answer, err := peerConnection.CreateAnswer(nil)
	if err != nil {
		panic(err)
	}
	err = peerConnection.SetLocalDescription(answer)
	if err != nil {
		panic(err)
	}

	<-gatherComplete

	return C.CString(peerConnection.LocalDescription().SDP)
}

go build -buildmode=c-shared -o lib.dll .\lib.go
  • Вопрос задан
  • 148 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы