33import android .annotation .TargetApi ;
44import android .media .MediaCodec ;
55import android .media .MediaCodecInfo ;
6+ import android .media .MediaCodecList ;
67import android .media .MediaFormat ;
78import android .os .Build ;
89import 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