2010-08-20 3 views
8

Мне нужно объединить несколько файлов jpg в видео, используя библиотеку FFmpeg. Но у меня проблема с чтением этих файлов. Вот функция, которая считывает файл изображения и делает 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

+2

@Maxito это было так давно. Поскольку я помню, что цветовая схема была повреждена не для всех изображений, а окончательные изображения, которые использовались в приложении, не имели такой проблемы. – darja

Смежные вопросы