Pjsip C#库AudioMediaPlayer.startTransmit二次创建内存访问异常问题
解决Pjsip C# API中AudioMediaPlayer播放新文件时的内存访问异常问题
优先复用现有AudioMediaPlayer实例(推荐方案)
频繁创建新Player实例易引发资源泄漏或内存冲突,复用实例是更安全的方式:- 停止当前播放传输:调用
StopTransmit()终止旧音频的传输 - 关闭当前加载文件:调用
Close()释放当前文件资源 - 加载新音频文件:调用
Open()传入新文件路径 - 重新启动传输:调用
StartTransmit()关联到呼叫的AudioMedia对象
示例代码:
// 假设player是已初始化的AudioMediaPlayer实例,callAudioMedia是呼叫的音频媒体通道 player.StopTransmit(callAudioMedia); player.Close(); // 加载新的音频文件(确保路径正确、格式支持如WAV) player.Open(@"C:\new_message.wav"); player.StartTransmit(callAudioMedia);- 停止当前播放传输:调用
正确清理旧Player实例(若必须新建实例)
若确需创建新实例,必须彻底清理旧实例资源,避免内存冲突:- 停止旧Player的传输:
oldPlayer?.StopTransmit(callAudioMedia) - 释放旧Player资源:调用
Dispose()并将引用置为null - 创建新Player实例并初始化播放
示例代码:
// 清理旧实例 oldPlayer?.StopTransmit(callAudioMedia); oldPlayer?.Dispose(); oldPlayer = null; // 创建新实例并播放新文件 var newPlayer = new AudioMediaPlayer(); newPlayer.Open(@"C:\new_message.wav"); newPlayer.StartTransmit(callAudioMedia); // 保存新实例引用以便后续清理 oldPlayer = newPlayer;- 停止旧Player的传输:
确保操作在Pjsip线程上下文执行
Pjsip媒体操作需在其内部线程中执行,跨线程操作可能导致内存访问异常。可使用PjSipHelper.Invoke()将操作封装到Pjsip线程:PjsipHelper.Invoke(() => { // 在这里执行Player的创建、播放等操作 player.StartTransmit(callAudioMedia); });验证媒体通道状态
操作Player前,确认呼叫的AudioMedia通道处于活跃状态(如呼叫状态为CallState.CONFIRMED),避免对已失效的媒体对象进行操作。
内容的提问来源于stack exchange,提问作者Norbert Herman
相关产品推荐
相关产品推荐

