2010-08-20 4 views
8

Je dois joindre plusieurs fichiers jpg en vidéo en utilisant la bibliothèque FFmpeg. Mais j'ai un problème avec la lecture de ces fichiers. Voici une fonction qui lit le fichier d'image et rend AVFrame:FFmpeg: Fichier Jpeg en 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))); 
    } 
} 

Cela provoque aucune erreur, mais ne crée que cadre noir, pas d'image. Qu'est-ce qui ne va pas?

Répondre

2

Ce code est correct (à l'exception du problème avec le schéma de couleurs). Il y avait un bug dans l'ajout de frame à la vidéo.

+0

Avez-vous déjà résolu le problème des couleurs? Une idée? – Maxito

+2

@Maxito c'était il y a si longtemps. Comme je me souviens de la palette de couleurs a été corrompu pas pour toutes les images, et les images finales qui ont été utilisées dans l'application n'a pas eu un tel problème. – darja

Questions connexes