2010-08-20 13 views
8

Necesito unir varios archivos jpg en video usando la biblioteca FFmpeg. Pero tengo un problema con la lectura de estos archivos. Aquí es una función que lee el archivo de imagen y hace que AVFrame:FFmpeg: archivo Jpeg a 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))); 
    } 
} 

Esto provoca ningún error, pero sólo crea un marco negro, ninguna imagen. ¿Qué está mal?

Respuesta

2

Este código es correcto (excepto por el problema con el esquema de color). Hubo un error al agregar fotograma a video.

+0

¿Alguna vez resolvió el problema del esquema de color? ¿Alguna idea? – Maxito

+2

@Maxito fue hace mucho tiempo. Como recuerdo, el esquema de colores no se corrompió para todas las imágenes, y las imágenes finales que se usaron en la aplicación no tuvieron ese problema. – darja