我怎么知道任何h264文件的持续时间?

我有一个文件,其中只有h264帧以NAL单位的forms存在。 那么现在是否有任何方法可以计算该文件的持续时间?

我不知道文件中有多少帧。 我只有文件大小。

PS:我想做的就是使用C语言和Linux平台。

你的问题毫无意义,这就是为什么有人投票给你的原因。

容器文件

首先,没有H264 file这样的东西。 可以有一个容纳H264编码video的容器文件(MP4,AVI,MKV)。 该容器格式通常还包含告诉您包含的video持续时间的数据。 因此,您必须解析该文件,检查格式文档以查看保存持续时间的位置,然后将其解压缩。

最简单的方法是使用像Augusto建议的FFMPEG。

NAL字节流

如果您的文件只是一个接一个地保存的NAL单位,就像在NAL字节流中一样,那么您就无法获得video持续时间! 由于H264编码图像不保存定时信息。

如果是这种情况,如果您知道videoFPS,您仍然可以进行近似…您需要计算文件中的所有帧,不包括:

  • 序列参数集
  • 图片参数集
  • 流的结束
  • 序列结束
  • 过滤数据
  • 访问单元分隔符

然后进行数学运算: NUMBER_OF_FRAMES / FPS = DURATION_IN_SECONDS

RTP流

如果您错了并且每个NAL单元顶部都有RTP标头,您可以通过检查每个RTP标头的RTP时间轻松获得video持续时间。 RTP Header中的字节含义是什么,你可以在这里找到: http : //www.networksorcery.com/enp/protocol/rtp.htm 。 您希望从每个部分获取TIMESTAMP部分(4个字节整数)。 代码应该这样做:

 int last_timestamp = GetNextTimestamp(); double duration_in_ms = 0; while(true) { int next = GetNextTimestamp(); duration_in_ms += (next - last_timestamp)/90000.0; last_timestamp = next; } 

很多很多开发人员使用的持久时间的脏方法是运行ffmpeg来从文件中获取信息,并解析ffmpeg在stdout上打印的内容。 我知道它不理想,但它有效。

如果你运行ffmpeg -i Sintel.2010.1080p.mkv (你可以从这里下载ffmpeg -i Sintel.2010.1080p.mkv ),其中一个输出行是Duration: 00:14:48.03, start: 0.000000, bitrate: 640 kb/s 。 您可以解析该行并提取持续时间。

您可以通过直接从ffmpeg调用一些C函数来获取相同的信息,但这不在我的掌握之中。

h.264确实包含定时信息。

原始附件h.264某种forms的数据(存储器或文件)将包含一些“序列参数集”或SPS帧。 这些通常包含定时信息,特别是“time_scale”和“num_units_in_tick”。 在大多数情况下,帧速率是固定的,其由SPS中的“fixed_frame_rate_flag”指定。 每帧的持续时间为2 * num_units_in_tick / time_scale(2 == 1 + nuit_field_based_flag)。 帧通常由“访问单元分隔符”分隔。

帧持续时间的帧数将为您提供总持续时间。