2016-11-07 32 views
0

비디오 스트림에서 이미지를 추출하는 프로그램을 작성하고 있습니다. 지금까지 올바른 프레임을 찾아 비디오 스트림을 디코딩하고 AVFrame 구조체에 관련 데이터를 수집하는 방법을 알아 냈습니다. 이제 데이터를 JPEG 이미지로 쓰려고하는데 코드가 작동하지 않습니다. 내가 가진 코드는 여기에서있다 : 그 코드를 사용하는 경우 https://gist.github.com/RLovelett/67856c5bfdf5739944edAVFrame을 JPEG 이미지로 작성하는 방법

int save_frame_as_jpeg(AVCodecContext *pCodecCtx, AVFrame *pFrame, int FrameNo) { 
    AVCodec *jpegCodec = avcodec_find_encoder(AV_CODEC_ID_JPEG2000); 
    if (!jpegCodec) { 
     return -1; 
    } 
    AVCodecContext *jpegContext = avcodec_alloc_context3(jpegCodec); 
    if (!jpegContext) { 
     return -1; 
    } 

    jpegContext->pix_fmt = pCodecCtx->pix_fmt; 
    jpegContext->height = pFrame->height; 
    jpegContext->width = pFrame->width; 

    if (avcodec_open2(jpegContext, jpegCodec, NULL) < 0) { 
     return -1; 
    } 
    FILE *JPEGFile; 
    char JPEGFName[256]; 

    AVPacket packet = {.data = NULL, .size = 0}; 
    av_init_packet(&packet); 
    int gotFrame; 

    if (avcodec_encode_video2(jpegContext, &packet, pFrame, &gotFrame) < 0) { 
     return -1; 
    } 

    sprintf(JPEGFName, "dvr-%06d.jpg", FrameNo); 
    JPEGFile = fopen(JPEGFName, "wb"); 
    fwrite(packet.data, 1, packet.size, JPEGFile); 
    fclose(JPEGFile); 

    av_free_packet(&packet); 
    avcodec_close(jpegContext); 
    return 0; 
} 

가, 내가 가진 첫 번째 오류가 설정되지되는 AVCodecContexttime_base에 대해이었다. 나는 비디오 디코딩 AVCodecContext 구조의 타임베이스로 설정했습니다. 이제 다른 오류가 발생합니다.

[jpeg2000 @ 0x7fd6a4015200] dimensions not set 
[jpeg2000 @ 0x7fd6a307c400] dimensions not set 
[jpeg2000 @ 0x7fd6a5800000] dimensions not set 
[jpeg2000 @ 0x7fd6a307ca00] dimensions not set 
[jpeg2000 @ 0x7fd6a3092400] dimensions not set 

이미지가 아직 쓰여지지 않습니다. Github Gist에서 한 의견 제시자는 메타 데이터가 JPEG 이미지에 쓰여지고 있지 않지만이 메타 데이터는 어떻게 작성해야합니까? 인코딩 컨텍스트의 너비와 높이를 설정 했으므로 크기가 설정되지 않은 이유가 확실하지 않습니다.

+0

너비와 높이를 인쇄하면 나오는 값이 의미가 있습니까? 또한 들어오는 프레임이 정확한지 확인하기 위해 무엇을 했습니까? – Chris

답변

3

JPEG2000은 jpeg가 아닙니다. JPEG 이미지를 인코딩하려면 AV_CODEC_ID_MJPEG을 사용하십시오. MJPEG는 "모션 JPEG"의 약자로, 비디오 스트림을 구성하는 JPEG 그림 시퀀스가 ​​일반적으로 호출되는 방식입니다.

+0

감사합니다. 나는 MJPEG를 사용하여 끝내고 그것을 작동시켰다. –