Android4.1에서 키 프레임은 종종 실시간 인코딩 응용 프로그램에서 요청됩니다. 하지만 MediaCodec 객체를 사용하여이를 수행하는 방법은 무엇입니까? 현재 Android4.2 SDK가 지원하지 않는 것 같습니다.Android MediaCodec : 인코딩시 키 프레임을 요청하는 방법
2
A
답변
1
인코더를 구성 할 때 KEY_I_FRAME_INTERVAL 키를 설정하여 주기적 키 프레임을 요청할 수 있습니다. 아래 예에서는 2 초마다 하나씩 요청하고 있습니다. 명확성을 위해 프레임 속도 나 색상 형식과 같은 다른 키는 생략했지만 여전히 포함하려고합니다.
encoder = MediaCodec.createByCodecName(codecInfo.getName());
MediaFormat inputFormat = MediaFormat.createVideoFormat(mimeType, width, height);
/* ..... set various format options here ..... */
inputFormat.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 2);
encoder.configure(inputFormat, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
encoder.start();
나는 당신이 정말 요구하는 것은 컷 장면의 시작처럼, 인코딩 작업 동안 임의의 키 프레임을 요청하는 방법입니다, 그러나, 생각한다. 불행히도 나는 인터페이스를 보지 못했습니다. 인코더를 중지하고 다시 시작하면 다시 시작할 때 새 키 프레임을 만드는 효과가있을 수 있습니다. 그것을 시도 할 수있는 기회가 생기면 여기에 결과를 게시 할 것입니다.
도움이 되었기를 바랍니다. 비디오를 인코딩 할 때 필요 우연히
이MediaCodec codec = MediaCodec.createDecoderByType(type);
codec.configure(format, ...);
codec.start();
ByteBuffer[] inputBuffers = codec.getInputBuffers();
for (;;) {
int inputBufferIndex = codec.dequeueInputBuffer(timeoutUs);
if (inputBufferIndex >= 0) {
// fill inputBuffers[inputBufferIndex] with valid data
...
codec.queueInputBuffer(inputBufferIndex, 0, inputBuffers[inputBufferIndex].limit(), presentationTime,
isKeyFrame ? MediaCodec.BUFFER_FLAG_SYNC_FRAME : 0);
}
}
임의의 키 프레임을 삽입 할 : -
태드 Phetteplace GLACI, 주식
는
3
당신은 은 입력 버퍼를 대기 할 때 MediaCodec.BUFFER_FLAG_SYNC_FRAME을 지정하여 임의의 키 프레임을 생성 할 수 있습니다 Galaxy Nexus에서 MediaCodec에서 비디오의 시작 부분에 키 프레임을 자동으로 생성하지 않았습니다.
0
MediaCodec에는 setParameters
이라는 구조가 있습니다. 코 틀린에 당신은 좋아하는 수행 할 수 있습니다
fun yieldKeyFrame(): Boolean {
val param = Bundle()
param.putInt(MediaCodec.PARAMETER_KEY_REQUEST_SYNC_FRAME, 0)
try {
videoEncoder.setParameters(param)
return true
} catch (e: IllegalStateException) {
return false
}
}
는 videoEncoder
는 MediaCodec의 인스턴스 인코딩하도록 구성되어 있습니다.