问题一:
api-example.c的功能是先自己生成一个MPEG1的文件,然后再按帧保存成PGM文件。我的问题是PGM格式是个什么格式,为什么我通过PHOTOSHOP打开后,这些图像都不是原先的视频图像显示,而是原视频图像的黑白显示。
问题二:
我把api-example.c中原来的codec = avcodec_find_decoder(CODEC_ID_MPEG1VIDEO);改成codec = avcodec_find_decoder(CODEC_ID_MPEG2VIDEO);目的是测试一下他将一个已有的正常MPEG2文件按帧保存成PGM文件的效果。结果是这些图像都只能显示原先的视频图像的上面的三分之一部分(彩色显示),而无法完全显示。
问题三:
我把api-example.c中原有的保存PGM功能删掉加上了一段自己写的转码功能,该功能参照FFMPEG中的output_example.c。
代码如下:
len = avcodec_decode_video2(c, picture, &got_picture, &avpkt);
if (got_picture)
{
  fflush(stdout);
  if (img_convert_ctx == NULL)
  {
    img_convert_ctx = sws_getContext(c->width, c->height,PIX_FMT_YUV420P,c->width, c->height,video_st->codec-  >pix_fmt, sws_flags, NULL, NULL, NULL);
   }
   tmp_picture = alloc_picture(PIX_FMT_YUV420P, c->width, c->height);
   sws_scale(img_convert_ctx, picture->data, picture->linesize,0, c->height,tmp_picture->data,tmp_picture->linesize);
    int out_size = avcodec_encode_video(video_st->codec,video_outbuf, video_outbuf_size, tmp_picture);
    if (out_size > 0)
    {
       AVPacket pkt;
       av_init_packet(&pkt);
       if(video_st->codec->coded_frame->key_frame)
         pkt.flags |= PKT_FLAG_KEY;
       pkt.stream_index= video_st->index;
       pkt.data= video_outbuf;
       pkt.size= out_size;
       int ret = av_interleaved_write_frame(oc, &pkt);
       frame++;
     }
     avpkt.size -= len;
     avpkt.data += len;
   }
}
结果是这些图像还是只能显示原先的视频图像的上面的三分之一部分(彩色显示),而且马赛克严重。
请高手赐教

解决方案 »

  1.   

    这个例子如何编译啊?
    第一个问题 我才 pgm格式应该是 yuv的格式吧?api-example 输出保存的只是data[0]即是Y,当然是没有颜色的 
      

  2.   

    楼上正解呵呵,
    我是变成YUV422保存的。
      

  3.   

    请教一下楼主,我在VC下编译api-example.c这个文件,用的是sdk,运行出现bitrate tolerance too small for bitrate这个提示,我把 c->bit_rate = 400000; 把这个改大了,还是会出现这个问题,改成64000倒是可以了,运行时又出现“MPEG1/2 does not support 1/25 fps”这个,这个很怪异,您是
      

  4.   

    不好意思,刚才没写完
    您是用Linux编译的还是vc?如果是vc,能不能给我一个代码?
      

  5.   

    在我机器(Linux)上楼主说的所有问题我都没有遇到过。另外,要是想在VC里面编译ffmpeg源码,你需要解决N多的细节问题才可以完全无错。
      

  6.   


    哈哈。我和你一样。问题是 你提供的 time_base 错了。汗。