问题一:
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;
}
}
结果是这些图像还是只能显示原先的视频图像的上面的三分之一部分(彩色显示),而且马赛克严重。
请高手赐教
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;
}
}
结果是这些图像还是只能显示原先的视频图像的上面的三分之一部分(彩色显示),而且马赛克严重。
请高手赐教
第一个问题 我才 pgm格式应该是 yuv的格式吧?api-example 输出保存的只是data[0]即是Y,当然是没有颜色的
我是变成YUV422保存的。
您是用Linux编译的还是vc?如果是vc,能不能给我一个代码?
哈哈。我和你一样。问题是 你提供的 time_base 错了。汗。