【问题标题】:saving H.264 encoded images with libavcodec使用 libavcodec 保存 H.264 编码图像
【发布时间】:2011-12-03 02:58:07
【问题描述】:

我从 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 函数简单地使用基本的 fopenfwrite 函数来保存图像。如果我解码帧然后保存,一切正常。但我在保存编码帧时遇到问题。编码的帧以非常小的尺寸保存,然后无法解码。 有什么问题吗?我将非常感谢这方面的任何帮助。

【问题讨论】:

  • +1 有趣的问题。严格来说,H.264 中确实没有“原始图像”这样的东西。您得到的最接近的是 I 帧,其变换系数可以自行保存。其他所有内容(P 帧、B 帧)都与某个 I 帧相关。你只是在I帧之后吗?如果没有,您打算如何处理其他类型的帧?最后,您能否包含更完整的源代码,同时显示有效的部分(解码和保存为图像)?
  • 好吧,我想我对“原始图像”这个词造成了一些混淆。我正在获取 H.264 编码的图像,并希望在不解码的情况下保存图像。我所拥有的只是缓冲区的 uint8_t 地址和缓冲区大小。如何保存这张图片?
  • 是的,你制造了很多混乱。你确定你得到的是 H.264 编码的 images 而不是 H.264 编码的 video 吗?有很大的不同。
  • 我正在获取 H.264 视频。我只想保存 Intra 帧,因为我认为它们可以成功解码。我对视频不感兴趣,但对连续的单个图像感兴趣。
  • 我想我已经开始明白你想要达到的目标了。但是,您需要注意,I 帧并不代表连续的图像(每 30 帧左右出现一个 I 帧,其余为 P 或 B 帧)。

标签: c ffmpeg h.264 libavcodec


【解决方案1】:

H.264 不是“图片”编码格式,它是“电影”编码格式。编码器不会单独对每张图片进行编码,它会查看一组图片,并将任何给定图片的编码传播到组中的图片中。

如果您在大多数情况下查看单个编码图片,您会发现它对其他图片的引用可能在编码流中之前或之后。解码器可能需要获得其他几张图片才能解码您的目标图片。

您可能需要选择一种不同的编码格式,让您可以做您想做的事,而 H.264 则不能。独立于其他图片对每张图片进行编码的格式称为“帧内编码”。

【讨论】:

  • 从技术上讲,您仍然可以使用 H.264 帧内编码对图片进行编码。见sonnati.wordpress.com/2010/10/19/h-264-for-image-compression。不过,为什么 IP 摄像机会这样做,我无法理解。
  • 有趣。内部编码的 H.264 在广播行业也很流行,松下的 AVC-Intra 格式。但我不确定这在低比特率相机上是否有意义,如果只使用 I 帧,整体图像质量会明显降低。
猜你喜欢
  • 2011-04-02
  • 2020-05-26
  • 1970-01-01
  • 2012-11-07
  • 2012-06-06
  • 1970-01-01
  • 2011-10-30
  • 1970-01-01
相关资源
最近更新 更多