是否可以在python中使用pjsua2实时使用基于AudioMedia内存/缓冲区的播放端口? - python

我正在基于pjsua2使用python开发SIP客户端。我有一个基于python wrapper call的自定义Call类,并且我的代码能够建立活动连接。在我的自定义onCallMediaState上,我可以访问音频会议桥:

    def onCallMediaState(self, prm):
        """
        Manage call media state callbacks.

        - Autoconnect audio
        """
        ci = self.getInfo()

        logger.info("onCallMediaState", media_size=ci.media.size())
        self._print_call_info("onCallMediaState")

        for media_index, media in enumerate(ci.media):
            if media.type == pj.PJMEDIA_TYPE_AUDIO:
                if ci.stateText == "CONFIRMED":
                    """
                    It seems a bug with callbacks. CONFIRMED
                    is send at start and disconnect. So stop
                    record is manual, cannot use DISCONNECTD
                    """
                    logger.info("Call CONFIRMED")

此时,我可以使用media_index录制或播放从呼叫中传入的音频。例如,用于记录:

    def record_call(self, media_index):
        """
        Record the audio incoming from call using default playback device
        """
        record_media = pj.Endpoint_instance().audDevManager().getCaptureDevMedia()
        audio_media = pj.AudioMedia.typecastFromMedia(self.getMedia(media_index))
        port_id = audio_media.getPortId()
        rx_level = audio_media.getRxLevel()
        tx_level = audio_media.getTxLevel()
        filename = "file.wav"
        logger.info("Recording audio media", port_id=port_id, rx_level=rx_level, tx_level=tx_level)
        self._recorder = pj.AudioMediaRecorder()
        self._recorder.createRecorder(filename);
        self._is_recording = True
        record_media.startTransmit(self._recorder)

并创建一个file.wav。或用于使用默认音频设备:

    def play_call(self, media_index):
        """
        Play the audio incoming from call using default playback device
        """
        playback_media = pj.Endpoint_instance().audDevManager().getPlaybackDevMedia()
        audio_media = pj.AudioMedia.typecastFromMedia(self.getMedia(media_index))
        port_id = audio_media.getPortId()
        rx_level = audio_media.getRxLevel()
        tx_level = audio_media.getTxLevel()
        logger.info("Playing audio media", port_id=port_id, rx_level=rx_level, tx_level=tx_level)
        audio_media.startTransmit(playback_media)

这两个示例均有效,并且根据PjSUA2 Media documentation和Audio media documentation可以发送和接收音频,播放和记录WAV。但是根据pjsip Media Port documentation,其他媒体也是可能的。似乎SWIG wrapper不支持它。

最后,我的问题是,是否可以在不记录wav文件的情况下管理内存中的音频帧?

我不想将音频写入硬盘,而只是在内存中使用它,为此,我直接需要原始数据。一种解决方法是编写一个大块的wav文件,并逐个读取它,但这是一个肮脏的解决方案,且开销很大。根据Media flow documentation可以获取回调,但是我找不到如何在Python中执行此操作。 python包装器中不存在typedef void *MediaPort来尝试绕过回调。

参考方案

我一直在研究相同的东西,但不是pjsua2,而是pjsua。最初,pjsip不支持pjsua(不确定pjsua2),但是我在GitHub上找到了一个项目,该项目具有pjproject 2.2的自定义项,带有缓冲流,称为“ UFAL-DSG / alex”。

我在“ nicolaipre / python3-pjsip-memory-buffer”中将定制移植到了python3和pjproject 2.9。

我知道pjsua2可能对您没有用,但也许可以帮助其他人寻找类似的东西。

Python-crontab模块 - python

我正在尝试在Linux OS(CentOS 7)上使用Python-crontab模块我的配置文件如下:{ "ossConfigurationData": { "work1": [ { "cronInterval": "0 0 0 1 1 ?", "attribute&…

Python:检查是否存在维基百科文章 - python

我试图弄清楚如何检查Wikipedia文章是否存在。例如,https://en.wikipedia.org/wiki/Food 存在,但是https://en.wikipedia.org/wiki/Fod 不会,页面只是说:“维基百科没有此名称的文章。”谢谢! 参考方案 >>> import urllib >>> prin…

Python Pandas导出数据 - python

我正在使用python pandas处理一些数据。我已使用以下代码将数据导出到excel文件。writer = pd.ExcelWriter('Data.xlsx'); wrong_data.to_excel(writer,"Names which are wrong", index = False); writer.…

Python GPU资源利用 - python

我有一个Python脚本在某些深度学习模型上运行推理。有什么办法可以找出GPU资源的利用率水平?例如,使用着色器,float16乘法器等。我似乎在网上找不到太多有关这些GPU资源的文档。谢谢! 参考方案 您可以尝试在像Renderdoc这样的GPU分析器中运行pyxthon应用程序。它将分析您的跑步情况。您将能够获得有关已使用资源,已用缓冲区,不同渲染状态上…

Python:在不更改段落顺序的情况下在文件的每个段落中反向单词? - python

我想通过反转text_in.txt文件中的单词来生成text_out.txt文件,如下所示:text_in.txt具有两段,如下所示:Hello world, I am Here. I am eighteen years old. text_out.txt应该是这样的:Here. am I world, Hello old. years eighteen a…