【问题标题】:Extracting I-Frames from H264 in MPEG-TS in C从 C 中的 MPEG-TS 中的 H264 中提取 I 帧
【发布时间】:2012-04-03 04:48:17
【问题描述】:

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

我已经完成了一些 MPEG-TS 容器格式的工作,但我对编解码器并不是很专业。

我宁愿寻找信息。

非常感谢。

【问题讨论】:

  • 虽然 I 帧是一个完整的图片,但它仍然是编码的。解码它是一项复杂的任务。有什么理由不使用编解码器?
  • 只是想自己尝试一下。你有什么推荐的图书馆吗?
  • 除非您是真正的专业人士,否则不要考虑自己解码(查看 H264 标准 grin)。 x264ffmpeg 是一个选项,虽然我不知道如何只强制 I 帧。
  • @gekod:只是想知道从 I 帧中“提取图片的数据”对你意味着什么......
  • @puffadder:由于 I 帧是从 P 帧和 B 帧派生而来的完整图片,因此我想将 I 帧保存为图片(JPEG?)。我试图做的是从流中创建预览并将它们保存为图像。

标签: c h.264


【解决方案1】:

我不是该领域的专家,但我相信您的问题的答案是否定的。

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

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

【讨论】:

    【解决方案2】:

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

    英特尔的 IPP 库具有解码器和示例解码器的基本构建块:

    Code Samples for the Intel® Integrated Performance Primitives

    还有 libavcodec:

    Using libavformat and libavcodec

    Revised avcodec_sample.0.4.9.cPP

    【讨论】:

      【解决方案3】:

      我也不是这个领域的专家。但我玩过解码。使用这个 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 元素。将控制程序写入管道(参见example):

      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 帧开始解码流。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-02-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-24
        • 2013-09-15
        • 2011-10-20
        • 1970-01-01
        相关资源
        最近更新 更多