Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C中从MPEG-TS中的H264中提取I帧_C_H.264 - Fatal编程技术网

在C中从MPEG-TS中的H264中提取I帧

在C中从MPEG-TS中的H264中提取I帧,c,h.264,C,H.264,我正在试验视频,想知道如何从MPEG-TS容器中包含的H264中提取I帧。 我想做的是从视频流中生成预览图像。 由于I帧被认为是P帧和B帧派生的完整图片,是否有可能只提取图片的数据而不必使用编解码器对其进行解码 我已经在MPEG-TS容器格式方面做了一些工作,但我在编解码器方面不是很专业 我相当想寻找信息 非常感谢。我不是这方面的专家,但我相信你的问题的答案是否定的 如果要将I帧保存为JPEG图像,则仍然需要对视频帧进行“转码”,即首先需要使用H264解码器对I帧进行解码,然后使用JPEG编码器

我正在试验视频,想知道如何从MPEG-TS容器中包含的H264中提取I帧。 我想做的是从视频流中生成预览图像。 由于I帧被认为是P帧和B帧派生的完整图片,是否有可能只提取图片的数据而不必使用编解码器对其进行解码

我已经在MPEG-TS容器格式方面做了一些工作,但我在编解码器方面不是很专业

我相当想寻找信息


非常感谢。

我不是这方面的专家,但我相信你的问题的答案是否定的

如果要将I帧保存为JPEG图像,则仍然需要对视频帧进行“转码”,即首先需要使用H264解码器对I帧进行解码,然后使用JPEG编码器对其进行编码。这是因为JPEG编码器不理解H264帧,它只接受未压缩的视频帧作为输入


另一方面,由于JPEG编码器的输入是未压缩的帧,因此您可以从任何类型的帧(I/p/B)生成JPEG图像,因为它在馈送到编码器之前已经被解码(如果需要,使用参考I帧)

我也不是这方面的专家。但我玩过解码。使用此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元素。将控制程序写入管道(请参阅):


不带GST的缓冲区\u缓冲区\u标志\u增量\u单位标志集为I帧。您可以安全地跳过许多帧并在任何I帧处开始解码流。

正如其他人所指出的,解码h.264是复杂的。您可以编写自己的解码器,但这是一项重大工作。为什么不使用现有的解码器

英特尔IPP库具有解码器和样本装饰的基本构建块:

有一个libavcodec:


虽然I-frame是一幅完整的图片,但它仍然是经过编码的。。解码它是一项复杂的任务。有没有不使用编解码器的理由?我只是想自己尝试一下。你会推荐一些库吗?除非你是一个真正的专业人士,否则甚至不要考虑自己解码它(查看H264标准咧嘴笑)
x264
ffmpeg
是一个选项,尽管我不知道如何仅强制I帧。@gekod:只是想知道从I帧中“提取图片数据”对您意味着什么…@puffadder:由于I帧是P帧和B帧派生的整个图片,所以我想将I帧保存为图片(JPEG?)。我试图做的是从流中创建预览并将它们保存为图像。
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