2016-12-29 19 views
1

, 그것은 msg (msg->findInt32("profile", &profile)/msg->findInt32("level", &level))에서 profilelevel를 읽고는 msgMediaCodec.configure()format에서 오는 것으로 보인다.이 값을 수동으로 설정하지 않으면 Android MediaCodec에서 설정할 AVC 프로필/레벨은 무엇입니까? 안드로이드 ACodec.cpp <code>setupAVCEncoderParameters</code>에서

물론
format.setInteger(MediaCodec.KEY_PROFILE, MediaCodecInfo.CodecProfileLevel.AVCProfileHigh); 
format.setInteger(MediaCodec.KEY_LEVEL, MediaCodecInfo.CodecProfileLevel.AVCLevel5); 

우리의 장치 지원 프로파일/레벨 우리가 설정 한 경우 우리가 konw하지 않기 때문에, 나는 그것이 좋은 생각이 아니다 동의 : 그래서, 우리가 아래와 같이 MediaCodec.configure() 전에 수동 profile/level을 설정할 수 있다고 생각 . 또한 대부분의 예제 코드가 이러한 값을 전혀 설정하지 않았다는 것을 알았습니다. 예를 들어

:

MediaFormat format = MediaFormat.createVideoFormat(MIME_TYPE, mWidth, mHeight); 
format.setInteger(MediaFormat.KEY_COLOR_FORMAT, MediaCodecInfo.CodecCapabilities.COLOR_FormatSurface); // API >= 18 
format.setInteger(MediaFormat.KEY_BIT_RATE, calcBitRate()); 
format.setInteger(MediaFormat.KEY_FRAME_RATE, FRAME_RATE); 
format.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 10) 

mMediaCodec = MediaCodec.createEncoderByType(MIME_TYPE); 
mMediaCodec.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE); 

은 어쩌면 그들은 자동으로 설정됩니다? MediaCodec은 현재 프로파일/레벨의 현재 장치를 지원하고 자동으로 선택합니까? 장치가 둘 이상의 프로필/레벨을 지원하는 경우 어떤 프로필/레벨이 선택됩니까? 하위 레벨 1 (기준선 등) 또는 상위 레벨 1 (높음, 예)?

답변

1

높은 프로필 (B 프레임 사용)을 사용하면 호출자가 올바르게 처리 할 준비가 필요하기 때문에 대부분의 경우 (필자가 아는 한) 기준이됩니다 (사소한/순진한 응용 프로그램에서 B- 프레임을 유지하지 못하는 가정), B- 프레임이있는 인코더는 대기 시간이 길어집니다.