2015-05-04 136 views
0

我正在用最新的ffmpeg库编写包装代码。我从本地系统提供MP4文件。我的问题是,当我使用av_decode_video2()时,我无法获得任何解码帧。返回值出现负值。我用av_read_frame()返回0.我搜索了我面临的问题,但没有找到正确的解释。请在这里给我见解。在此粘贴伪代码。无法使用最新的ffmpeg库解码mp4文件:av_decode_video2

av_init_packet(avpkt); 
    picture=av_frame_alloc(); 
    pFrameRGB=av_frame_alloc(); 
    codec = avcodec_find_decoder(CODEC_ID_H264); 
    c= avcodec_alloc_context3(codec) 
    avcodec_open2(decoderLibraryData->c, decoderLibraryData->codec, NULL) 
    FormatContext = avformat_alloc_context(); 
    char *pUrl ="./1.MP4"; 

    iRet = avformat_open_input(atContext, pUrl, pFmt, NULL); 

    if(FormatContext == NULL) 
    { 
     printf("could not assign any memory !!!!!!!!! \n"); 
    } 

    avformat_find_stream_info(FormatContext, NULL); 


    while(av_read_frame(FormatContext,avpkt) >= 0) 
    { 

     len = avcodec_decode_video2(c, picture, &got_picture,avpkt); 

     printf("CODEC MANAGER len %d Frame decompressed %d \n",len,got_picture); 

     if (len <= 0) 
     { 
     return ERROR; 
     } 
    } 
} 



     if(lastHeight != 0 && lastWidth != 0) 
     { 
      if(lastWidth != c->width || lastHeight != c->height) 
      { 
       av_free(buffer); 
       buffer = NULL; 
       lastWidth = c->width; 
       lastHeight = c->height; 

      } 
     } 
     else 
     { 
      lastWidth = c->width; 
      lastHeight = c->height; 
     } 
     decodeFlag = 1; 
     if(!buffer) 
     { 
      int numBytes; 
      v_mutex_lock(globalCodecLock); 
      switch(inPixFormat) 
      { 
      case RGB: 


       // Determine required buffer size and allocate buffer 
       numBytes=avpicture_get_size(PIX_FMT_RGB24, c->width, c->height); 

       buffer=(uint8_t *)av_malloc(numBytes*sizeof(uint8_t)); 
       avpicture_fill((AVPicture *)pFrameRGB,buffer,PIX_FMT_RGB24,c->width, c->height); 

       if(cntxt) 
        sws_freeContext(cntxt); 

       cntxt = sws_getContext(c->width, c->height, c->pix_fmt, 
         c->width, c->height, PIX_FMT_RGB24, SWS_BICUBIC, NULL, NULL, NULL); 

       break; 

      } 
      v_mutex_unlock(globalCodecLock); 
      if(cntxt == NULL) 
      { 
       printf("sws_getContext error\n"); 
       return ERROR; 
      } 
      } 

     { 
      sws_scale(cntxt, picture->data, picture->linesize, 0, c->height, pFrameRGB->data, pFrameRGB->linesize); 
      if(rgbBuff) 
      { 


       if(c->width <= *width && c->height <= *height) 
       {     
        saveFrame(pFrameRGB, c->width, c->height, rgbBuff,inPixFormat); 

        *width = c->width; 
        *height = c->height; 
        rs = SUCCESS; 
        break; 
       } 
       else 
       { 
        rs = VA_LOWBUFFERSIZE; 
       } 
      } 
      else 
      { 
       rs = VA_LOWBUFFERSIZE; 
      } 
     } 
     if(width) 
     { 
      *width = c->width; 
     } 
     if(height) 
     { 
      *height = c->height; 
     } 
     if(rs == VA_LOWBUFFERSIZE) 
     { 
      break; 
     } 

我得到的av_read_frame返回值为负0,但av_decode_video2返回值。我无法在这里得到任何线索。

回答

1

确保您有人称

av_register_all(); 

avcodec_register_all(); 

在您的应用程序的开始。

此外,它似乎是从呼叫avformat_find_stream_info的问题。用以下代码测试:

AVPacket avpkt; 
    av_init_packet(&avpkt); 
    AVFrame* picture = av_frame_alloc(); 
    AVFrame* pFrameRGB = av_frame_alloc(); 

    AVFormatContext* c2 = avformat_alloc_context(); 

    char *pUrl = "C:/Sample Videos/20-06-34.MP4"; 
    int video_stream_index = 0; 

    AVInputFormat* pFmt; 
    int iRet = avformat_open_input(&c2, pUrl, pFmt, NULL); 

    AVStream* stream = c2->streams[video_stream_index]; 


    AVCodec* codec = avcodec_find_decoder(stream->codec->codec_id); 
    avcodec_open2(stream->codec, codec, NULL); 

    if (c2 == NULL) 
    { 
     printf("could not assign any memory !!!!!!!!! \n"); 
    } 

    while (av_read_frame(c2, &avpkt) >= 0) 
    { 

     int got_picture; 
     int len = avcodec_decode_video2(stream->codec, picture, &got_picture, &avpkt); 

     printf("CODEC MANAGER len %d Frame decompressed %d \n", len, got_picture); 

     if (len <= 0) 
     { 
      return ERROR; 
     } 
    } 
+0

是的,我补充说,以及但没有运气 – suvirai

+0

我试过上面的代码。我没有得到以前的错误。我现在正在获得一些有效的len值。但在运行时,我得到这样的警告并停止[IMGUTILS @ 0x7fffffffdb48]图片尺寸为0x0无效 [IMGUTILS @ 0x7fffffffdb48]图片尺寸为0x0无效 断言失败说明在libswscale/swscale_internal.h:650 程序接收到的信号SIGABRT ,中止。 – suvirai

+0

你在做另一个不在上面代码中的步骤吗?我测试了一个完整的视频文件,并没有发生错误。也许这取决于你的视频文件。 –