2010-08-20 39 views
8

我需要使用FFmpeg庫將幾個jpg文件加入視頻。但是我在閱讀這些文件時遇到了問題。這裏是一個讀取圖像文件,使AVFrame功能:FFmpeg:Jpeg文件到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 2015-06-05 18:39:51

+2

@Maxito很久以前。正如我所記得的,顏色方案並非針對所有圖像都已損壞,而應用程序中使用的最終圖像沒有這樣的問題。 – darja 2015-06-08 09:51:07