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

时间:2011-09-15 10:26:02

标签: c ffmpeg h.264 duration video-codecs

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

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

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

3 个答案:

答案 0 :(得分:5)

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

容器文件

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

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

NAL字节流

如果您的文件只是一个接一个地保存的NAL单位,就像在NAL字节流中一样,那么 IS NO WAY 就可以获得视频时长!由于H264编码图像不保存定时信息。

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

  • 序列参数集
  • 图片参数集
  • End Of Stream
  • 序列结束
  • 过滤数据
  • 访问单位分隔符

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

RTP流

如果您错了并且每个NAL单元顶部都有RTP标头,您可以通过检查每个RTP标头的RTP时间轻松获得视频持续时间。 RTP标头中的字节含义是什么,你可以在这里找到: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;
}

答案 1 :(得分:1)

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

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

您可以通过直接从ffmpeg调用某个C函数来获取相同的信息,但这超出了我的知识范围。

答案 2 :(得分:1)

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

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

分隔

帧持续时间的帧数乘以总持续时间。