2012-12-04 4 views

답변

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의 인스턴스 인코딩하도록 구성되어 있습니다.

관련 문제