2013-02-01 1 views
0

H264로 인코딩 된 비디오를 디코딩하려고합니다. AVPacket의 데이터와 크기를 디코더 코드로 보냅니다. 거기 프레임을 해독하고 GUI에 표시하려고합니다. 문제는 내가 프레임을 디코딩 할 때 패킷의 크기와 동일한 수의 프레임 바이트를 반환한다는 것입니다. 즉, 데이터의 압축을 풀지 못한다는 의미입니다. 어느 것이 문제가 될 것인지 알려줄 수 있습니까? 내 인코딩 프로그램이 정상적으로 작동하고 있습니다. 여기libavcodec 비디오 디코딩이 작동하지 않습니다.

... 나는 다른 방법으로 AVCodecContext 및 코덱과 같은 다른 모든 코드를 초기화하고

int len ,got_frame; 

avpkt.size = data_length; 

avpkt.data = frame_buffer; 

if(!frame_buffer){ 

return "frame buffer empty\n"; 

} 

len = avcodec_decode_video2(avctx ,frame ,&got_frame ,&avpkt); 

if(len < 0){ 

    return "error while decoding\n"; 

} 

if(got_frame){ 

static struct SwsContext *img_convert_ctx; 

if(img_convert_ctx == NULL) { 

    img_convert_ctx = sws_getContext(w, h, 
     PIX_FMT_YUV420P, avctx->width, 
     avctx->height, PIX_FMT_BGR24, 
     SWS_BICUBIC, NULL, NULL, NULL); 

    if(img_convert_ctx == NULL) { 

    return "Cannot initialize the conversion context!\n"; 

    } 

} 

j=sws_scale(img_convert_ctx, 
    frame->data , frame->linesize , 
    0, h ,picture->data, 
    picture->linesize); 

if(j==0){ 

exit(1); 

} 

인코딩

static struct SwsContext *img_convert_ctx; 
    pkt.data = NULL; 
    pkt.size = 0; 


    avpicture_fill((AVPicture *)srcFrame, frame,AV_PIX_FMT_BGR24, 640, 480); 
if(img_convert_ctx == NULL) { 
    int w = 640; 
    int h = 480; 
    img_convert_ctx = sws_getContext(w, h, 
     AV_PIX_FMT_BGR24, c->width, c->height, PIX_FMT_YUV420P, SWS_BICUBIC, NULL, NULL, NULL); 
    if(img_convert_ctx == NULL) { 
    fprintf(stderr, "Cannot initialize the conversion context!\n"); 
    } 
} 
    sws_scale(img_convert_ctx, srcFrame->data, srcFrame->linesize, 0,480,picture->data, picture->linesize); 


    fflush(stdout); 

    picture->pts=counter; 


    ret = avcodec_encode_video2(c, &pkt, picture, &got_output); 
    if (ret < 0) { 
     fprintf(stderr, "Error encoding frame\n"); 
    } 

    if (got_output) { 

     vdec.decode_frame(pkt.data ,pkt.size); 

     av_free_packet(&pkt); 
    } 

디코더 코드에 대한 코드입니다.

해결 방법을 찾도록 도와주십시오.

답변

0

avcodec_decode_video2 함수는 결과 그림의 바이트 수가 아닌 처리 된 바이트 수를 반환해야합니다. 전체 프레임을 디코딩 한시기를 확인하려면 got_frame의 값을 확인하기 만하면됩니다.

+0

그렇습니다. 왜냐하면 got_frame은 항상 1을 반환하기 때문에 프레임을 디코딩하고 있지만, 창에 페인트하려고 할 때 항상 왜곡 된 프레임을 보여줍니다. – Imrank

+0

어떤 종류의 왜곡을보고 있습니까? 가능하다면 예를 든다. – pogorskiy

+0

ffmpeg 포럼 링크에서 동일한 질문을했습니다. http://ffmpeg.zeranoe.com/forum/viewtopic.php?f=7&t=949 이미지를 참조하십시오. – Imrank

관련 문제