繁体   English   中英

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

[英]How can i know the duration of any h264 file?

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

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

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

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

容器文件

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

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

NAL字节流

如果你的文件只有NAL单元保存此起彼伏,就像在一个NAL字节流,也没有办法 ,你可以得到的视频长度! 由于H264编码图像不保存定时信息。

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

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

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

RTP流

如果您错了并且每个NAL单元顶部都有RTP标头,您可以通过检查每个RTP标头的RTP时间轻松获得视频持续时间。 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;
}

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

原始附件h.264某种形式的数据(存储器或文件)将包含一些“序列参数集”或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)。 帧通常由“访问单元分隔符”分隔。

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

许多很多开发人员使用的持久时间的脏方法是运行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函数来获取相同的信息,但这不在我的掌握之中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM