我制作了一个使用WebRTC DSP库(AEC,NS,AGC,VAD)的软件.现在我需要知道每个算法使用什么算法来编写我的硕士论文,但我没有找到任何相关的信息.
有人知道这个库的算法,特别是声学回声消除(例如NLMS,我知道它常用,但我不知道WebRTC是否也使用它).
我已经尝试了解查看源代码的算法,但我还不够了解.
提前致谢!
我正在使用 Electron(版本 10,Chrome v75)和 WebRTC 构建视频会议应用程序。该应用程序有多个窗口,在每个窗口中,我都有一个单独的 RTCPeerConnection 和不同的应用程序用户。问题是,如果我不使用耳机,就会有强烈的回声,使该应用程序几乎无法使用。
我尝试设置各种getUserMedia选项,例如echoCancellation: true或googEchoCancellation: true、echoCancellationType: "browser"/"system",但没有一个能够消除各种声源的回声。
此问题仅出现在 Mac 和 Linux 上,而 Windows 可以非常有效地抑制回声。
我发现这个 Chromium 问题更详细地描述了类似的问题。
另外,当我在 Chrome + Mac 或 Linux 上尝试这个Fiddle时(尽管 Chrome 对于这种情况并不完美,请在此处找到更多详细信息),我没有看到回声消除的效果,并且回声仍然存在。然而,同样的事情在 Chrome + Windows 或 Firefox + 任何操作系统上都可以完美运行。
Chrome 中的 AEC(回声消除)真的没有考虑到所有声源吗?有人知道解决方法吗?
我正在使用其AudioRecord和AudioTrack类制作Android到Android的VoIP(扬声器)应用程序,以及通过NDK的Speex进行回声消除.我能够成功传入并从Speex的speex_echo_cancellation()函数中检索数据,但回声仍然存在.
以下是录制/发送和接收/播放音频的相关android线程代码:
//constructor
public MyThread(DatagramSocket socket, int frameSize, int filterLength){
this.socket = socket;
nativeMethod_initEchoState(frameSize, filterLength);
}
public void run(){
short[] audioShorts, recvShorts, recordedShorts, filteredShorts;
byte[] audioBytes, recvBytes;
int shortsRead;
DatagramPacket packet;
//initialize recorder and player
int samplingRate = 8000;
int managerBufferSize = 2000;
AudioTrack player = new AudioTrack(AudioManager.STREAM_MUSIC, samplingRate, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT, managerBufferSize, AudioTrack.MODE_STREAM);
recorder = new AudioRecord(MediaRecorder.AudioSource.MIC, samplingRate, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT, managerBufferSize);
recorder.startRecording();
player.play();
//record first packet
audioShorts = new short[1000];
shortsRead = recorder.read(audioShorts, 0, audioShorts.length);
//convert shorts to bytes to …Run Code Online (Sandbox Code Playgroud) 我正在构建一个应用程序,它需要麦克风取消来自扬声器的任何声音。似乎这个问题几乎是一个在线阴谋,因为其他有完全相同问题的人在很长一段时间内都没有得到回应。
Android 的原生硬件加速 AcousticEchoCanceler 似乎不适用于大多数设备。在许多设备上进行的测试以及似乎可以正常工作的设备包括 Nexus 5 和 Moto X,而几乎所有测试的三星设备都无法去除背景声音。注意:所有测试的手机都返回 trueAcousticEchoCanceler.isAvailable()
然而,必须有一个解决方案,因为诸如 Skype 或 WhatsApp 之类的应用程序似乎会取消其应用程序上下文之外的声音,即扬声器上有呼叫并且麦克风会取消收到的任何反馈。
这个简化的录音应用程序将声音录制到文件中,然后在单击播放时播放。
主活动.java
public class MainActivity extends Activity {
Button startRec, stopRec, playBack;
int minBufferSizeIn;
AudioRecord audioRecord;
short[] audioData;
Boolean recording;
int sampleRateInHz = 48000;
private String TAG = "TAG";
/**
* Called when the activity is first created.
*/
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
startRec = (Button) findViewById(R.id.startrec);
stopRec = (Button) findViewById(R.id.stoprec);
playBack = (Button) findViewById(R.id.playback);
startRec.setOnClickListener(startRecOnClickListener);
stopRec.setOnClickListener(stopRecOnClickListener);
playBack.setOnClickListener(playBackOnClickListener);
playBack.setEnabled(false); …Run Code Online (Sandbox Code Playgroud) 参考文档:https :
//developer.android.com/reference/android/media/MediaSyncEvent.html
因为我正在使用 Speex 库进行 AEC(回声消除)
speex_echo_cancellation();
Run Code Online (Sandbox Code Playgroud)
我发现扬声器线程中接收到的音频数据(播放)和麦克风线程中记录的音频数据(捕获)中,它们需要同步,但我没有这样做。我想知道 MediaSyncEvent 会对此有所帮助吗?
如果没有,有人知道如何使播放和捕获的音频数据同步吗?
如何从另一个中减去一个音频波?一般而言,在C#中(或者如果我们不能在C/C++中的C#中这样做)
我有声波A和声波B(BTW:它们在PCM中)我想从A中减去B
我需要什么?开源库(不是GPL,但LGPL会没问题)有关如何进行此类操作的教程(使用或不使用库)有关此主题的文章
PS:这都是关于AEC的......
我目前正在从事 webrtc 项目,并且在不使用耳机或外部麦克风时遇到音频回声问题,是否有任何解决方法或解决方法
我正在开发一个以 48 kHz 采样率运行的 VoIP 应用程序。由于它使用 Opus(内部使用 48 kHz)作为其编解码器,并且当前大多数 Android 硬件本身都以 48 kHz 运行,因此 AEC 是我现在唯一缺少的部分。我已经找到了 WebRTC 实现,但我似乎不知道如何使其工作。看起来它会随机破坏内存并迟早使整个系统崩溃。当它没有崩溃时,声音有点厚重,好像半帧的声音比较安静。这是我处理 20 毫秒帧的代码:
webrtc::SplittingFilter* splittingFilter;
webrtc::IFChannelBuffer* bufferIn;
webrtc::IFChannelBuffer* bufferOut;
webrtc::IFChannelBuffer* bufferOut2;
// ...
splittingFilter=new webrtc::SplittingFilter(1, 3, 960);
bufferIn=new webrtc::IFChannelBuffer(960, 1, 1);
bufferOut=new webrtc::IFChannelBuffer(960, 1, 3);
bufferOut2=new webrtc::IFChannelBuffer(960, 1, 3);
// ...
int16_t* samples=(int16_t*)data;
float* fsamples[3];
float* foutput[3];
int i;
float* fbuf=bufferIn->fbuf()->bands(0)[0];
// convert the data from 16-bit PCM into float
for(i=0;i<960;i++){
fbuf[i]=samples[i]/(float)32767;
}
// split it into three "bands" that the AEC needs …Run Code Online (Sandbox Code Playgroud) 我正在为Android开发SIP软电话应用程序,并面临回声消除问题.我试图使用Speex解决它没有成功.所以我的下一个镜头是WebRTC AEC(声学回声消除),但我找不到任何关于如何使用它的文档.
在我的应用程序中,音频使用Java中的AudioTrack和AudioRecord类进行管理,但发送和接收的套接字是C代码(与JNI集成).WebRTC是一个大型项目,我只想集成AEC模块.
有人知道我必须包含哪些文件,编译器需要哪些标志,哪些函数调用,等等?我有CSipSimple代码,它也使用WebRTC(但也用于其他用途),我找不到包含和使用它的简单方法.
谢谢.