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