gpt4 book ai didi

python - 是否可以在python中使用pjsua2来实时使用AudioMedia Memory/Buffer-based Playback Port?

转载 作者:行者123 更新时间:2023-12-03 00:21:12 26 4
gpt4 key购买 nike

我正在使用python开发一个SIP客户端,基于pjsua2 。我有一个基于 python wrapper call 的自定义调用类我的代码能够获得有效的连接。在我的自定义 onCallMediaState 上,我可以访问音频 session 桥:

    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 documentationAudio media documentation可以传输和接收音频、播放和录制WAV。但根据pjsip Media Port documentation其他媒体也是可能的。看来SWIG wrapper不支持。

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

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

最佳答案

我一直在研究同样的问题,但针对的是 pjsua 而不是 pjsua2。最初,pjsip 不支持 pjsua(不确定是否适用于 pjsua2),但我在 GitHub 上发现了一个项目,该项目对 pjproject 2.2 进行了自定义,并带有缓冲流,名为“UFAL-DSG/alex”。

我将自定义移植到“nicolaipre/python3-pjsip-memory-buffer”中的 python3 和 pjproject 2.9。

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

关于python - 是否可以在python中使用pjsua2来实时使用AudioMedia Memory/Buffer-based Playback Port?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59250633/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com