Skip to content

Commit 7e0ad6b

Browse files
committed
修复兼容部分机型硬编码失败的问题。
Change-Id: Ib418740ff192f4daaa9c87e535bb4d5490987066
1 parent 8d1fcc0 commit 7e0ad6b

File tree

1 file changed

+42
-2
lines changed

1 file changed

+42
-2
lines changed

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

Lines changed: 42 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import android.annotation.TargetApi;
44
import android.media.MediaCodec;
55
import android.media.MediaCodecInfo;
6+
import android.media.MediaCodecList;
67
import android.media.MediaFormat;
78
import android.os.Build;
89
import android.os.Bundle;
@@ -27,17 +28,24 @@ public class VideoEncoder {
2728
private int MAX_BITRATE_LENGTH = 1000000;
2829
private int beginBitRate = 0;
2930

31+
private String firstSupportColorFormatCodecName = ""; // OMX.qcom.video.encoder.avc 和 c2.android.avc.encoder 过滤,这两个h264编码性能好一些。如果都不支持COLOR_FormatYUV420Planar,就用默认的方式。
32+
3033
public VideoEncoder(VideoEncodeParam param) {
3134
this.videoEncodeParam = param;
35+
checkSupportedColorFormats();
3236
initMediaCodec();
3337
}
3438

3539
private void initMediaCodec() {
3640
try {
37-
mediaCodec = MediaCodec.createEncoderByType("video/avc");
41+
if (!firstSupportColorFormatCodecName.isEmpty()) {
42+
mediaCodec = MediaCodec.createByCodecName(firstSupportColorFormatCodecName);
43+
} else {
44+
mediaCodec = MediaCodec.createEncoderByType("video/avc");
45+
}
3846
//height和width一般都是照相机的height和width。
3947
//TODO 因为获取到的视频帧数据是逆时针旋转了90度的,所以这里宽高需要对调
40-
MediaFormat mediaFormat = MediaFormat.createVideoFormat("video/avc", videoEncodeParam.getHeight(), videoEncodeParam.getWidth());
48+
MediaFormat mediaFormat = MediaFormat.createVideoFormat(MediaFormat.MIMETYPE_VIDEO_AVC, videoEncodeParam.getHeight(), videoEncodeParam.getWidth());
4149
//描述平均位速率(以位/秒为单位)的键。 关联的值是一个整数
4250
int bitRate = videoEncodeParam.getBitRate();
4351
if (bitRate > MAX_BITRATE_LENGTH) {
@@ -327,4 +335,36 @@ public void setEncoderListener(OnEncodeListener listener) {
327335
public void stop() {
328336
executor.shutdown();
329337
}
338+
339+
private void checkSupportedColorFormats() {
340+
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
341+
MediaCodecList codecList = new MediaCodecList(MediaCodecList.ALL_CODECS);
342+
MediaCodecInfo[] codecInfos = codecList.getCodecInfos();
343+
344+
for (MediaCodecInfo codecInfo : codecInfos) {
345+
if (!codecInfo.isEncoder()) {
346+
continue;
347+
}
348+
349+
if (codecInfo.getName().equals("OMX.qcom.video.encoder.avc") || codecInfo.getName().equals("c2.android.avc.encoder")) {
350+
351+
String[] supportedTypes = codecInfo.getSupportedTypes();
352+
for (String type : supportedTypes) {
353+
if (type.startsWith("video/")) {
354+
MediaCodecInfo.CodecCapabilities capabilities = codecInfo.getCapabilitiesForType(type);
355+
int[] colorFormats = capabilities.colorFormats;
356+
for (int colorFormat : colorFormats) {
357+
358+
if (colorFormat == MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420Planar) {
359+
Log.d("TAG", "Video encoder: " + codecInfo.getName() + ", supported color format: " + colorFormat);
360+
firstSupportColorFormatCodecName = codecInfo.getName();
361+
return;
362+
}
363+
}
364+
}
365+
}
366+
}
367+
}
368+
}
369+
}
330370
}

0 commit comments

Comments
 (0)