You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pjsip C#库AudioMediaPlayer.startTransmit二次创建内存访问异常问题

解决Pjsip C# API中AudioMediaPlayer播放新文件时的内存访问异常问题
  • 优先复用现有AudioMediaPlayer实例(推荐方案)
    频繁创建新Player实例易引发资源泄漏或内存冲突,复用实例是更安全的方式:

    1. 停止当前播放传输:调用StopTransmit()终止旧音频的传输
    2. 关闭当前加载文件:调用Close()释放当前文件资源
    3. 加载新音频文件:调用Open()传入新文件路径
    4. 重新启动传输:调用StartTransmit()关联到呼叫的AudioMedia对象

    示例代码:

    // 假设player是已初始化的AudioMediaPlayer实例,callAudioMedia是呼叫的音频媒体通道
    player.StopTransmit(callAudioMedia);
    player.Close();
    // 加载新的音频文件(确保路径正确、格式支持如WAV)
    player.Open(@"C:\new_message.wav");
    player.StartTransmit(callAudioMedia);
    
  • 正确清理旧Player实例(若必须新建实例)
    若确需创建新实例,必须彻底清理旧实例资源,避免内存冲突:

    1. 停止旧Player的传输:oldPlayer?.StopTransmit(callAudioMedia)
    2. 释放旧Player资源:调用Dispose()并将引用置为null
    3. 创建新Player实例并初始化播放

    示例代码:

    // 清理旧实例
    oldPlayer?.StopTransmit(callAudioMedia);
    oldPlayer?.Dispose();
    oldPlayer = null;
    
    // 创建新实例并播放新文件
    var newPlayer = new AudioMediaPlayer();
    newPlayer.Open(@"C:\new_message.wav");
    newPlayer.StartTransmit(callAudioMedia);
    // 保存新实例引用以便后续清理
    oldPlayer = newPlayer;
    
  • 确保操作在Pjsip线程上下文执行
    Pjsip媒体操作需在其内部线程中执行,跨线程操作可能导致内存访问异常。可使用PjSipHelper.Invoke()将操作封装到Pjsip线程:

    PjsipHelper.Invoke(() => {
        // 在这里执行Player的创建、播放等操作
        player.StartTransmit(callAudioMedia);
    });
    
  • 验证媒体通道状态
    操作Player前,确认呼叫的AudioMedia通道处于活跃状态(如呼叫状态为CallState.CONFIRMED),避免对已失效的媒体对象进行操作。

内容的提问来源于stack exchange,提问作者Norbert Herman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 02:42:46