当前位置: 代码迷 >> QT开发 >> QT 关于ffmpeg的保存图片的例子,该怎么解决
  详细解决方案

QT 关于ffmpeg的保存图片的例子,该怎么解决

热度:62   发布时间:2016-04-25 05:01:50.0
QT 关于ffmpeg的保存图片的例子
我在程序里面使用这诶个函数释放空间的时候,老是找不到,没搞清楚是我编译的问题还是版本到问题。
我打开avformat.h 里面是有这个函数的。我查看了一下,调用的头文件有没有错。才发现我有两个文件,内容有些不一样。于是我把av_free_packet()复制到没有的那个,编译提示定义了两次,在avcodec.h里面有个定义。暂时没搞明白,我直接把那个定义函数复制到avcodec里面,编译通过。但是保存的图片没有东西,源码上传了。

void SaveFrame(AVFrame *pFrame, int width, int height, int iFrame)
{
  FILE *pFile;
  char szFilename[32];
  int y;

  // Open file
  sprintf(szFilename, "frame%d.ppm", iFrame);
  pFile=fopen(szFilename, "wb");
  if(pFile==NULL)
  return;

  // Write header
  fprintf(pFile, "P6\n%d %d\n255\n", width, height);

  // Write pixel data
  for(y=0; y<height; y++)
  fwrite(pFrame->data[0], 1, width*3, pFile);

  // Close file
  fclose(pFile);
}

  av_register_all();

  const char *filename="img/test.avi";
  if(av_open_input_file(&pFormatCtx,filename,NULL,0,0)!=0) printf("av_open_input_file ERR!\n");
  else{
  if(av_find_stream_info(pFormatCtx)<0) printf("av_find_stream_info ERR!\n");
  else{
  dump_format(pFormatCtx, 0, filename, false);
  videoStream=-1;
  for(i=0; i<pFormatCtx->nb_streams; i++)
  if(pFormatCtx->streams[i]->codec->codec_type==CODEC_TYPE_VIDEO)
  {
  videoStream=i;
  break;
  }
  if(videoStream==-1) printf("videoStream ERR!\n");
  else{
  pCodecCtx=pFormatCtx->streams[videoStream]->codec;
  pCodec=avcodec_find_decoder(pCodecCtx->codec_id);
  if(pCodec==NULL) printf("Unsupported codec!\n");
  else{
  if(pCodec->capabilities & CODEC_CAP_TRUNCATED)
  pCodecCtx->flags|=CODEC_FLAG_TRUNCATED;
  if(avcodec_open(pCodecCtx, pCodec)<0) printf("avcodec_open ERR!\n");
  else{
  // if(pCodecCtx->frame_rate>1000 && pCodecCtx->frame_rate_base==1)
  // pCodecCtx->frame_rate_base=1000;
  // Hack to correct wrong frame rates that seem to be generated by some codecs
  if(pCodecCtx->time_base.num>1000 && pCodecCtx->time_base.den==1)
  pCodecCtx->time_base.den=1000;

  pFrame=avcodec_alloc_frame();
  pFrameRGB=avcodec_alloc_frame();
  if(pFrameRGB==NULL) printf("pFrameRGB==NULL ERR!\n");
  else{
  // Determine required buffer size and allocate buffer
  numBytes=avpicture_get_size(PIX_FMT_RGB24, pCodecCtx->width,
  pCodecCtx->height);
  buffer=(uint8_t *)av_malloc(numBytes*sizeof(uint8_t));
  // Assign appropriate parts of buffer to image planes in pFrameRGB
  // Note that pFrameRGB is an AVFrame, but AVFrame is a superset
  // of AVPicture
  avpicture_fill((AVPicture *)pFrameRGB, buffer, PIX_FMT_RGB24,
  pCodecCtx->width, pCodecCtx->height);
  相关解决方案