GB28181PJSIP库回声消除热拔插声音去抖

Posted 郭老二

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了GB28181PJSIP库回声消除热拔插声音去抖相关的知识,希望对你有一定的参考价值。

【目录】郭老二博文之:图像视频汇总

1、回声消除

Accoustic Echo Cancellation (AEC)
PJMEDIA 中有多个回声消除器实现,从简单的回声抑制器到完整的声学回声消除器AEC:

pjmedia_echo*:PJSIP自身的回声消除API
支持WebRTC AEC3:https://github.com/pjsip/pjproject/pull/2722
可以和webrtc集成:https://github.com/pjsip/pjproject/issues/1888
支持硬件的AEC/VPIO:https://github.com/pjsip/pjproject/issues/1778
支持Speex AEC:https://github.com/pjsip/pjproject/issues/589

2、热拔插

PJSIP没有热拔插的功能,只能自己实现。当检测到设备变化时,可以使用 pjmedia_aud_dev_refresh() 来刷新声音设备列表。
一般在未打开声音设备时执行此操作,即

先执行pjsua_set_no_snd_dev()强制关闭当前打开的声音设备,
再执行 pjmedia_aud_dev_refresh() 来刷新声音设备列表
最后执行 pjsua_set_snd_dev() 来重新管理声音设备

3、声音去抖

Agora.io - 如何在使用视频聊天时消除回声

【中文标题】Agora.io - 如何在使用视频聊天时消除回声【英文标题】:Agora.io - How to remove echo sound when using video chat 【发布时间】:2020-07-30 14:40:02 【问题描述】:

我正在尝试实现基本视频通话的代码示例 一切都很顺利,只是当我与电话 A 通话时,声音转移到电话 B 并在句末附加了回声,任何人都知道如何消除回声。 它发生在我的 A10 和 A71 以及计算机上。 我的脚本:

public void JoinChannel(string channelName)

    //set callback
    Debug.Log("Join channel");
    screen1.SetActive(true);
    screen2.SetActive(true);
    joinButton.SetActive(false);
    inputField.SetActive(false);
    mRtcEngine.OnJoinChannelSuccess = OnJoinChannelSuccess;
    mRtcEngine.OnUserJoined = OnUserJoined;
    mRtcEngine.OnUserOffline = OnUserOffline;
    
    //enable video
    mRtcEngine.EnableVideo();

    //allow camera output callback
    mRtcEngine.EnableVideoObserver();

    //join the channel
    mRtcEngine.JoinChannel(channelName, null, 0);

private void OnUserJoined(uint uid, int elapsed)

    textDebug.GetComponent<Text>().text = "OnUserJoined";
    Debug.Log("OnUserJoined");
    GameObject go;
    go = screen1;
    go.name = uid.ToString();

    VideoSurface o = go.AddComponent<VideoSurface>();
    o.SetForUser(uid);
    o.SetEnable(true);
    Debug.Log(uid);

    mRemotePeer = uid;

【问题讨论】:

【参考方案1】:

Agora SDK 支持回声消除。在大多数情况下,这个问题可以通过使用耳机来解决,并确保耳机不会产生回声。

在多个用户加入的频道中,如果设备无法正常工作,则频道中的所有其他用户都可能会听到回声。因此,请注意,听到回声的用户不一定是有问题的用户。

自检步骤: 检查以下内容:

找到回声的来源。您可以将频道中的用户一一静音,以找到回声的来源。 检查回声是偶发的还是连续的。 CPU 过载可能会导致偶尔出现回声。通过 Agora Analytics 的 Call Search 功能,您可以在 End-to-End Details 页面查看 CPU 使用率。 确保所有用户都处于分开的物理环境中,并且彼此之间不要坐得太近。 检查 SDK 版本:

Android/iOS:v1.6.0+。 Windows/macOS:v1.7.0+。

检查您是否启用了外部音频源。如果是这样,回声消除默认关闭。 在 Windows 中,确保未选中监控麦克风选项。 在 iOS 上,检查应用是否将 Audio Session 设置为 AVAudioSessionCategoryOptionMixWithOthers。如果是这样,当其他应用程序同时使用音频设备时,您可能会遇到回声。 部分 Android 或 Windows 设备的系统默认支持回声消除功能,如果系统的回声消除较差,您可能会遇到回声。在这种情况下,Agora 建议在系统中禁用回声消除,并使用 Agora 的回声消除。

使用耳机: 在一对一通话中,如果您听到回声,请让其他用户使用耳机。 在多用户通话中,要求用户依次静音,以找出造成回声的原因。引起回声的用户应使用耳机或将自己静音。

如需更多帮助和最新常见问题解答,请参阅https://docs.agora.io/en/faq/echo

【讨论】:

好像两个设备在一个房间里会有回声,会测试更多看看

以上是关于GB28181PJSIP库回声消除热拔插声音去抖的主要内容,如果未能解决你的问题,请参考以下文章

ONVIF,GB28181是干啥用的

如何使用 AVAudioEngine 取消或消除回声/重复声音?

hotplug 热拔插机制框架

WebRTC回声消除

HDMI接口之HPD(热拔插)

linux 上热拔插事件的检测