Chr*_*ris 2 audio android echo cancellation
我正在尝试使用android api中的AudioRecord类开发一个音频捕获应用程序,设置,如何使用MediaRecorder.AudioSource.MIC音频源,该应用程序可以工作,但是当我尝试使用回音消除时,设置一个MediaRecorder.AudioSource. VOICE_COMMUNICATION如何在创建AudioRecorder对象时抛出IllegalArgumentException,但我不知道为什么:
我的代码是:
private static final int SAMPLE_RATE = 16000;
private static final int BIT_ENCODING = AudioFormat.ENCODING_PCM_16BIT;
private static final int CHANNEL_CONFIGURATION = AudioFormat.CHANNEL_CONFIGURATION_MONO;
private int m_i32BufferSize;
private AudioRecord m_AudioRecorder;
public caudioCapture ()
{
super ();
m_i32BufferSize = AudioRecord.getMinBufferSize(SAMPLE_RATE, CHANNEL_CONFIGURATION, BIT_ENCODING);
//Create audio recorder object
try
{
m_AudioRecorder = new AudioRecord (MediaRecorder.AudioSource.VOICE_COMMUNICATION,SAMPLE_RATE,CHANNEL_CONFIGURATION,BIT_ENCODING,m_i32BufferSize);
}
catch (IllegalArgumentException e)
{
throw new IllegalArgumentException("Bad arguments on AudioRecorder creation", e);
}
Run Code Online (Sandbox Code Playgroud)
在我的Android清单中,我有:
uses-permission android:name ="android.permission.RECORD_AUDIO"
也许是因为我使用的是三星galaxy tab p1000并且它与Android 2.2一起运行?任何的想法?
非常感谢
小智 6
我终于能够在我的Arm5(WM8650)处理器上使用回声消除功能.以下是我采取的步骤.
在将PCM帧发送到编码器之前,我用JNI包装了Speex并调用了echo处理例程.无论我尝试什么Speex设置,都没有取消回音.
因为Speex对回放帧和回显帧之间的延迟非常敏感,所以我实现了一个队列,并将发送到AudioTrack的所有数据包排队.队列的大小应大致等于内部AudioTrack缓冲区的大小.这样,当AudioTrack从其内部缓冲区向声卡发送数据包时,数据包大致被发送到echo_playback.使用这种方法消除了延迟,但仍未取消回声
我用JNI包装了WebRtc回声消除部分,并在将数据包发送到编码器之前调用了它的方法.回声仍然存在,但图书馆显然试图取消它.
我应用了P2中描述的缓冲技术,它终于开始工作了.但是,需要针对每个设备调整延迟.另请注意,WebRtc具有移动和完整版本的回声消除功能.完整版本大大减慢了处理器速度,应该只能在ARM7上运行.移动版本工作但质量较低
我希望这会对某人有所帮助.