44import android .media .MediaCodec ;
55import android .media .MediaCodecInfo ;
66import android .media .MediaFormat ;
7+ import android .media .audiofx .AcousticEchoCanceler ;
8+ import android .media .audiofx .AutomaticGainControl ;
79import android .os .Build ;
810import android .util .Log ;
911
@@ -44,6 +46,8 @@ public class AudioEncoder {
4446 private final String TAG = AudioEncoder .class .getSimpleName ();
4547 private MediaCodec audioCodec ;
4648 private AudioRecord audioRecord ;
49+ private AcousticEchoCanceler canceler ;
50+ private AutomaticGainControl control ;
4751
4852 private final MicParam micParam ;
4953 private final AudioEncodeParam audioEncodeParam ;
@@ -55,9 +59,21 @@ public class AudioEncoder {
5559
5660
5761 public AudioEncoder (MicParam micParam , AudioEncodeParam audioEncodeParam ) {
62+ this (micParam , audioEncodeParam , false , false );
63+ }
64+
65+
66+ public AudioEncoder (MicParam micParam , AudioEncodeParam audioEncodeParam , boolean enableAEC , boolean enableAGC ) {
5867 this .micParam = micParam ;
5968 this .audioEncodeParam = audioEncodeParam ;
6069 initAudio ();
70+ int audioSessionId = audioRecord .getAudioSessionId ();
71+ if (enableAEC && audioSessionId != 0 ) {
72+ Log .e (TAG , "=====initAEC result: " + initAEC (audioSessionId ));
73+ }
74+ if (enableAGC && audioSessionId != 0 ) {
75+ Log .e (TAG , "=====initAGC result: " + initAGC (audioSessionId ));
76+ }
6177 }
6278
6379 public void setOnEncodeListener (OnEncodeListener listener ) {
@@ -82,7 +98,6 @@ private void initAudio() {
8298 }
8399 }
84100
85- @ RequiresApi (api = Build .VERSION_CODES .LOLLIPOP )
86101 public void start () {
87102 new Thread (this ::record ).start ();
88103 }
@@ -91,6 +106,44 @@ public void stop() {
91106 stopEncode = true ;
92107 }
93108
109+ public boolean isDevicesSupportAEC () {
110+ return AcousticEchoCanceler .isAvailable ();
111+ }
112+
113+ private boolean initAEC (int audioSession ) {
114+
115+ boolean isDevicesSupportAEC = isDevicesSupportAEC ();
116+ Log .e (TAG , "isDevicesSupportAEC: " +isDevicesSupportAEC );
117+ if (!isDevicesSupportAEC ) {
118+ return false ;
119+ }
120+ if (canceler != null ) {
121+ return false ;
122+ }
123+ canceler = AcousticEchoCanceler .create (audioSession );
124+ canceler .setEnabled (true );
125+ return canceler .getEnabled ();
126+ }
127+
128+ public boolean isDevicesSupportAGC () {
129+ return AutomaticGainControl .isAvailable ();
130+ }
131+
132+ private boolean initAGC (int audioSession ) {
133+
134+ boolean isDevicesSupportAGC = isDevicesSupportAGC ();
135+ Log .e (TAG , "isDevicesSupportAGC: " +isDevicesSupportAGC );
136+ if (!isDevicesSupportAGC ) {
137+ return false ;
138+ }
139+ if (control != null ) {
140+ return false ;
141+ }
142+ control = AutomaticGainControl .create (audioSession );
143+ control .setEnabled (true );
144+ return control .getEnabled ();
145+ }
146+
94147 private void release () {
95148 if (audioRecord != null ) {
96149 audioRecord .stop ();
@@ -103,6 +156,18 @@ private void release() {
103156 audioCodec .release ();
104157 audioCodec = null ;
105158 }
159+
160+ if (canceler != null ) {
161+ canceler .setEnabled (false );
162+ canceler .release ();
163+ canceler = null ;
164+ }
165+
166+ if (control != null ) {
167+ control .setEnabled (false );
168+ control .release ();
169+ control = null ;
170+ }
106171 }
107172
108173 private void addADTStoPacket (ByteBuffer outputBuffer ) {
@@ -138,7 +203,6 @@ private void addADTStoPacket(byte[] packet, int packetLen) {
138203 packet [6 ] = (byte ) 0xFC ;
139204 }
140205
141- @ RequiresApi (api = Build .VERSION_CODES .LOLLIPOP )
142206 private void record () {
143207 if (audioCodec == null ) {
144208 return ;
@@ -156,7 +220,12 @@ private void record() {
156220 // 将 AudioRecord 获取的 PCM 原始数据送入编码器
157221 int audioInputBufferId = audioCodec .dequeueInputBuffer (0 );
158222 if (audioInputBufferId >= 0 ) {
159- ByteBuffer inputBuffer = audioCodec .getInputBuffer (audioInputBufferId );
223+ ByteBuffer inputBuffer = null ;
224+ if (android .os .Build .VERSION .SDK_INT >= android .os .Build .VERSION_CODES .LOLLIPOP ) {
225+ inputBuffer = audioCodec .getInputBuffer (audioInputBufferId );
226+ } else {
227+ inputBuffer = audioCodec .getInputBuffers ()[audioInputBufferId ];
228+ }
160229 int readSize = -1 ;
161230 if (inputBuffer != null ) {
162231 readSize = audioRecord .read (inputBuffer , bufferSizeInBytes );
@@ -168,7 +237,12 @@ private void record() {
168237
169238 int audioOutputBufferId = audioCodec .dequeueOutputBuffer (audioInfo , 0 );
170239 while (audioOutputBufferId >= 0 ) {
171- ByteBuffer outputBuffer = audioCodec .getOutputBuffer (audioOutputBufferId );
240+ ByteBuffer outputBuffer = null ;
241+ if (android .os .Build .VERSION .SDK_INT >= android .os .Build .VERSION_CODES .LOLLIPOP ) {
242+ outputBuffer = audioCodec .getOutputBuffer (audioOutputBufferId );
243+ } else {
244+ outputBuffer = audioCodec .getOutputBuffers ()[audioOutputBufferId ];
245+ }
172246 outputBuffer .position (audioInfo .offset );
173247 outputBuffer .limit (audioInfo .offset + audioInfo .size );
174248 addADTStoPacket (outputBuffer );
0 commit comments