2013-04-10 6 views
0

다음 코드는 jpeg 이미지에서 mp4 비디오 파일을 만듭니다. 이미지 수가 GOP 크기보다 크면 인코딩 성공과 avcodec_encode_video2에서 반환 한 이미지 gotPacket이> 0입니다.GOP 크기보다 작은 이미지 개수 인 경우 ffmpeg로 인코딩하는 방법

이미지 수가 GOP 크기보다 작 으면 GET보다 작음 getPacket은 항상 = 0이므로 이미지를 쓰지 않습니다. 파일.

내 생각 엔 그 avcodec_encode_video2 전체되지 길이 버퍼가 GOP 크기로 동일하고 완전하지 않습니다 때까지 gotPacket 내 질문이 버퍼의 경우에도 인코딩 avcodec_encode_video2을 강제하는 방법입니다 0

될 것입니다 할당합니다입니다 ?

... 
_outStream->codec.gop_size = 10; 
_outStream->codec.keyint_min = 10; 
... 

AVFrame* frame = getFrame(); 


AVPacket packet; 
av_init_packet(&packet); 
packet.data = NULL; 
packet.size = 0; 

int gotPacket = 0; 
if (avcodec_encode_video2(_outStream->codec, &packet, frame, &gotPacket) < 0) 
    throw std::runtime_error("failed to encode frame"); 

if (gotPacket) 
{ 
    ... 
    if (av_write_frame(_outContainer.get(), &packet) < 0) 
     throw std::runtime_error("failed to write frame");  
    av_free_packet(&packet); 
} 

답변

2

해결책을 찾았습니다. 인코딩 할 원시 비디오 데이터로 NULL을 전달하면 (3 번째 매개 변수) 인코더가 버퍼를 플러시합니다.

if (avcodec_encode_video2(_outStream->codec, &packet, NULL, &gotPacket)