在C语言中从MPEG-TS格式的H264视频中提取I帧

4
我正在进行视频实验,并想知道如何从MPEG-TS容器中包含的H264中提取I帧。我的目的是从视频流中生成预览图像。由于I帧���该是完整的图片,P帧和B帧是从其中派生出来的,所以是否有可能只提取图片的数据而无需使用编解码器进行解码?
我已经在MPEG-TS容器格式上做了一些工作,但并不太专注于编解码器。
我更在寻找信息。
非常感谢。

1
虽然I帧是一张完整的图片,但它仍然被编码了..解码它是一个复杂的任务。不使用编解码器的原因是什么? - Karoly Horvath
我只是想尝试自己做一下。你有什么库可以建议吗? - Helder AC
除非你是真正的专业人士,否则不要试图自己解码(检查H264标准咧嘴笑)。x264ffmpeg是一个选择,但我不知道如何强制只使用I帧。 - Karoly Horvath
@gekod:只是好奇想知道从I帧中“提取图片数据”对你来说意味着什么... - puffadder
@puffadder:由于I帧是P帧和B帧派生出来的整个图像,我想将I帧保存为图片(JPEG?)。我的目标是从流中创建预览并将其保存为图像。 - Helder AC
3个回答

3
我不是这个领域的专家,但我认为你问题的答案是否定的。
如果你想将I-frame保存为JPEG图像,你仍然需要“转码”视频帧,即你需要使用H264解码器首先解码I-frame,然后使用JPEG编码器进行编码。这是因为JPEG编码器无法理解H264帧,它只接受未压缩的视频帧作为输入。
此外,由于JPEG编码器的输入是未压缩的帧,所以你可以从任何类型的帧(I/P/B)生成JPEG图像,因为在 feeding 到编码器之前,它已经被解码(如果需要)使用参考 I 帧。

3

2

我也不是这个领域的专家,但我曾经尝试过解码。使用以下GStreamer管道从video.mp4中提取预览:

gst-launch -v filesrc location=./video.mp4 ! qtdemux name=demux demux.video_00 ! ffdec_h264 ! videorate ! 'video/x-raw-yuv,framerate=1/1' ! jpegenc ! multifilesink location=image-%05d.jpeg

如果您想编写一些代码,请将videorate替换为appsrc/appsink元素。编写控制程序到管道中(参见示例):

filesrc location=./video.mp4 ! qtdemux name=demux demux.video_00 ! ffdec_h264 ! appsink
appsrc ! 'video/x-raw-yuv,framerate=1/1' ! jpegenc ! multifilesink location=image-%05d.jpeg

没有设置GST_BUFFER_FLAG_DELTA_UNIT标志的缓冲区是I帧。您可以安全地跳过许多帧,并在任何I帧处开始解码流。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接