使用libavcodec保存H.264编码图像

时间:2011-10-07 15:37:46

标签: c ffmpeg h.264 libavcodec

我从IP摄像机获取H.264图像,并希望保存编码图像(无需解码)。我正在使用来自ffmpeg (libavformat / output-example.c) output-example.c 来实现此目的。为了保存原始H.264图像,我执行以下操作:

AVPacket pkt;
av_init_packet(&pkt);
if (c->coded_frame->pts != AV_NOPTS_VALUE)
        pkt.pts= av_rescale_q(c->coded_frame->pts, c->time_base, st->time_base);
if(c->coded_frame->key_frame)
        pkt.flags |= PKT_FLAG_KEY;
pkt.stream_index= st->index;
pkt.data= (uint8_t *)ulAddr;//video_outbuf;
pkt.size= out_size;
save_image(pkt.data, out_size);

其中 ulAddr 是指向图像的地址指针,out_size是图像大小。我想保存单个图像,而不是将图像保存到媒体视频文件。 save_image函数只使用基本的 fopen fwrite 函数来保存图像。如果我解码帧然后保存,一切正常。但是我在保存编码帧时遇到了问题。编码的帧以非常小的尺寸保存,然后无法解码。 有什么不对的吗?我真的很感激这方面的任何帮助。

1 个答案:

答案 0 :(得分:2)

H.264不是“图片”编码格式,它是一种“电影”编码格式。编码器不单独编码每个图像,它一起查看一组图像,并在组中的图像中扩展任何给定图像的编码。

如果在大多数情况下查看单个编码图片,您会发现它在编码流中引用了之前可能存在的其他图片。在能够解码目标图片之前,可能需要为解码器提供其他几个图片。

您可能需要选择不同的编码格式,以便您可以使用H.264,而不是。独立于其余部分编码每个图像的格式称为“帧内编码”。