Skip to content

Commit cf675a9

Browse files
committed
master上修改video-sdk部分同步到v2.4.x上面
Change-Id: I09e7e62af6389b0506adb3d42b9b08fb244f5c1d
1 parent 3f7c133 commit cf675a9

File tree

3 files changed

+115
-6
lines changed

3 files changed

+115
-6
lines changed

sdk/video-link-android/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ dependencies {
4949
// changing = true
5050
// }
5151
// api 'com.tencent.iot.thirdparty.android:xp2p-sdk:2.4.23'
52-
api 'com.tencent.iot.thirdparty.android:xp2p-sdk:2.4.28'
52+
api 'com.tencent.iot.thirdparty.android:xp2p-sdk:2.4.30'
5353
api 'com.tencent.iot.thirdparty.android:media-server:1.0.2'
5454
}
5555

sdk/video-link-android/src/main/java/com/tencent/iot/video/link/encoder/AudioEncoder.java

Lines changed: 78 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
import android.media.MediaCodec;
55
import android.media.MediaCodecInfo;
66
import android.media.MediaFormat;
7+
import android.media.audiofx.AcousticEchoCanceler;
8+
import android.media.audiofx.AutomaticGainControl;
79
import android.os.Build;
810
import 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);

sdk/video-link-android/src/main/java/com/tencent/iot/video/link/encoder/VideoEncoder.java

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,11 @@
44
import android.media.MediaCodecInfo;
55
import android.media.MediaFormat;
66
import android.os.Build;
7+
import android.os.Bundle;
78
import android.util.Log;
89

10+
import androidx.annotation.RequiresApi;
11+
912
import com.tencent.iot.video.link.listener.OnEncodeListener;
1013
import com.tencent.iot.video.link.param.VideoEncodeParam;
1114

@@ -19,8 +22,10 @@ public class VideoEncoder {
1922
private final VideoEncodeParam videoEncodeParam;
2023
private final ExecutorService executor = Executors.newSingleThreadExecutor();
2124
private MediaCodec mediaCodec;
25+
private MediaFormat mediaFormat;
2226
private OnEncodeListener encoderListener;
2327
private long seq = 0L;
28+
private int MAX_BITRATE_LENGTH = 1000000;
2429

2530
public VideoEncoder(VideoEncodeParam param) {
2631
this.videoEncodeParam = param;
@@ -34,7 +39,11 @@ private void initMediaCodec() {
3439
//TODO 因为获取到的视频帧数据是逆时针旋转了90度的,所以这里宽高需要对调
3540
MediaFormat mediaFormat = MediaFormat.createVideoFormat("video/avc", videoEncodeParam.getHeight(), videoEncodeParam.getWidth());
3641
//描述平均位速率(以位/秒为单位)的键。 关联的值是一个整数
37-
mediaFormat.setInteger(MediaFormat.KEY_BIT_RATE, videoEncodeParam.getBitRate());
42+
int bitRate = videoEncodeParam.getBitRate();
43+
if (bitRate > MAX_BITRATE_LENGTH) {
44+
bitRate = MAX_BITRATE_LENGTH;
45+
}
46+
mediaFormat.setInteger(MediaFormat.KEY_BIT_RATE, bitRate);
3847
//描述视频格式的帧速率(以帧/秒为单位)的键。帧率,一般在15至30之内,太小容易造成视频卡顿。
3948
mediaFormat.setInteger(MediaFormat.KEY_FRAME_RATE, videoEncodeParam.getFrameRate());
4049
//色彩格式,具体查看相关API,不同设备支持的色彩格式不尽相同
@@ -56,6 +65,32 @@ private void initMediaCodec() {
5665
}
5766
}
5867

68+
//描述平均位速率(以位/秒为单位)的键。 关联的值是一个整数
69+
@RequiresApi(api = Build.VERSION_CODES.KITKAT)
70+
public void setVideoBitRate(int bitRate) {
71+
int nowBitrate = videoEncodeParam.getBitRate();
72+
int nowWidth = videoEncodeParam.getWidth();
73+
int nowHeight = videoEncodeParam.getHeight();
74+
75+
if ((bitRate > nowWidth * nowHeight) || (bitRate < 10000) || (nowBitrate == bitRate) || (bitRate > MAX_BITRATE_LENGTH)) {
76+
return;
77+
}
78+
79+
videoEncodeParam.setBitRate(bitRate);
80+
81+
try {
82+
Bundle params = new Bundle();
83+
params.putInt(MediaCodec.PARAMETER_KEY_VIDEO_BITRATE, bitRate);
84+
mediaCodec.setParameters(params);
85+
86+
} catch (IllegalStateException e) {
87+
Log.e("TAG", "updateBitrate failed", e);
88+
}
89+
}
90+
91+
public int getVideoBitRate() {
92+
return videoEncodeParam.getBitRate();
93+
}
5994
/**
6095
* 将NV21编码成H264
6196
*/

0 commit comments

Comments
 (0)