【问题标题】:How to calculate GOP size of a file H264如何计算文件 H264 的 GOP 大小
【发布时间】:2014-07-23 12:51:10
【问题描述】:

我有一个使用 SVC 软件从 YUV 格式中提取的 h264 文件。现在,我想计算 h264 文件中每个 GOP 的大小。我们知道 GOP 的大小是两个最近的 I 帧之间的距离。 here。您能否向我建议如何计算给定 h264 文件的 GOP 大小。最好用C/C++实现。谢谢

【问题讨论】:

    标签: video media h.264 multimedia svc


    【解决方案1】:

    我个人更喜欢按 pict_type 过滤:

    ffprobe -show_frames input.h264 | grep pict_type
    

    这将显示框架结构:

    pict_type=I
    pict_type=P
    pict_type=P
    pict_type=P
    pict_type=P
    pict_type=P
    ...
    

    【讨论】:

      【解决方案2】:

      好吧,只是解析比特流来找到每个 I 帧有点棘手;除其他事项外,编码顺序可能(或不)与显示顺序不同。一种解决方案是使用 ffmpeg-suite 中的http://www.ffmpeg.org/ffprobe.html

      例子:

      ffprobe -show_frames input.bin | grep key_frame
      key_frame=1
      key_frame=0
      key_frame=0
      key_frame=0
      key_frame=0
      key_frame=0
      ...
      

      从输出中您可以轻松计算 GOP 长度

      另一个解决方案是修补在http://iphome.hhi.de/suehring/tml/ 找到的参考实现

      如果您在这部分需要帮助,请告诉我 :-)

      【讨论】:

      • 非常感谢。但就我而言,我使用 SVC 将 YUV 提取到 h264 位流。很难检测出哪个是关键帧。您还有其他解决方案吗?
      • 首先,什么是SVC?您将 YCbCr 文件编码为 H.264 比特流,并且您想从该文件或任何其他 H.264 中获取 GOP 长度?
      • SVC 是可扩展视频编码。这是正确的。我的目标是从 H264 流中获取 GOP 长度
      • 确实有人在使用 SVC? :-) 如果您不喜欢 ffmpeg 解决方案,请查看我在答案中链接到的参考 sw。二进制ldecod.exe 将帧类型输出到标准输出。在 src 代码中添加一个计数器来计算 IDR (I) 帧之间的帧数差异也非常简单。
      【解决方案3】:
      #!/bin/sh
      
      ffprobe -show_frames $1 > output.txt
      
      GOP=0;
      
      while read p; do
        if [ "$p" = "key_frame=0" ]
        then
          GOP=$((GOP+1))
        fi
      
      if [ "$p" = "key_frame=1" ]
      then
        echo $GOP
        GOP=0;
      fi
      
      done < output.txt
      

      【讨论】:

        【解决方案4】:

        使用如下命令:

        ffprobe -show_entries frame=pict_type  mp4_sample.mp4  -of flat | grep I
        

        你会看到如下结果:

        frames.frame.0.pict_type="I"
        frames.frame.384.pict_type="I"
        frames.frame.764.pict_type="I"
        frames.frame.1027.pict_type="I"
        frames.frame.1164.pict_type="I"
        frames.frame.1544.pict_type="I"
        frames.frame.1944.pict_type="I"
        frames.frame.2183.pict_type="I"
        frames.frame.2324.pict_type="I"
        

        【讨论】:

          【解决方案5】:

          由于每个 GOP 都以关键帧开头,因此您需要对它们进行计数。
          pict_type 可能会产生误导,因为所有类型都可能出现在 GOP 内部。

          ffprobe -show_frames video_file.h264  | grep -A 3 "type=video" | grep "key_frame=1" | wc -l
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-01-12
            • 2012-11-13
            • 2010-10-12
            • 2011-11-24
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多