2010-08-20 18 views
8

मुझे FFmpeg लाइब्रेरी का उपयोग करके वीडियो में कई जेपीजी फ़ाइलों में शामिल होने की आवश्यकता है। लेकिन मुझे इन फाइलों को पढ़ने में समस्या है। यहाँ एक समारोह जो छवि फ़ाइल पढ़ता है और बनाता है AVFrame है:एफएफएमपीईजी: जेपीईजी फ़ाइल को AVFrame

AVFrame* OpenImage(const char* imageFileName) 
{ 
    AVFormatContext *pFormatCtx; 

    if(av_open_input_file(&pFormatCtx, imageFileName, NULL, 0, NULL)!=0) 
    { 
     printf("Can't open image file '%s'\n", imageFileName); 
     return NULL; 
    }  

    dump_format(pFormatCtx, 0, imageFileName, false); 

    AVCodecContext *pCodecCtx; 

    pCodecCtx = pFormatCtx->streams[0]->codec; 
    pCodecCtx->width = W_VIDEO; 
    pCodecCtx->height = H_VIDEO; 
    pCodecCtx->pix_fmt = PIX_FMT_YUV420P; 

    // Find the decoder for the video stream 
    AVCodec *pCodec = avcodec_find_decoder(pCodecCtx->codec_id); 
    if (!pCodec) 
    { 
     printf("Codec not found\n"); 
     return NULL; 
    } 

    // Open codec 
    if(avcodec_open(pCodecCtx, pCodec)<0) 
    { 
     printf("Could not open codec\n"); 
     return NULL; 
    } 

    // 
    AVFrame *pFrame; 

    pFrame = avcodec_alloc_frame(); 

    if (!pFrame) 
    { 
     printf("Can't allocate memory for AVFrame\n"); 
     return NULL; 
    } 

    int frameFinished; 
    int numBytes; 

    // Determine required buffer size and allocate buffer 
    numBytes = avpicture_get_size(PIX_FMT_YUVJ420P, pCodecCtx->width, pCodecCtx->height); 
    uint8_t *buffer = (uint8_t *) av_malloc(numBytes * sizeof(uint8_t)); 

    avpicture_fill((AVPicture *) pFrame, buffer, PIX_FMT_YUVJ420P, pCodecCtx->width, pCodecCtx->height); 

    // Read frame 

    AVPacket packet; 

    int framesNumber = 0; 
    while (av_read_frame(pFormatCtx, &packet) >= 0) 
    { 
     if(packet.stream_index != 0) 
      continue; 

     int ret = avcodec_decode_video2(pCodecCtx, pFrame, &frameFinished, &packet); 
     if (ret > 0) 
     { 
      printf("Frame is decoded, size %d\n", ret); 
      pFrame->quality = 4; 
      return pFrame; 
     } 
     else 
      printf("Error [%d] while decoding frame: %s\n", ret, strerror(AVERROR(ret))); 
    } 
} 

यह कोई त्रुटि होती है लेकिन केवल काले फ्रेम, कोई छवि बनाता है। गलत क्या है?

उत्तर

2

इस कोड (रंग योजना के साथ समस्या के अलावा) सही है। वीडियो में फ्रेम जोड़ने में एक बग था।

+0

क्या तुमने कभी रंग योजना समस्या हल किया? कोई उपाय? – Maxito

+2

@ मैक्सिटो यह बहुत समय पहले था। जैसा कि मुझे याद है कि रंगीन योजना सभी छवियों के लिए दूषित नहीं हुई थी, और ऐप में उपयोग की जाने वाली अंतिम छवियों में ऐसा कोई मुद्दा नहीं था। – darja

संबंधित मुद्दे