DirectShow中的时间戳的简单讲解

原创 2002年11月04日 13:03:00

时间编码

一、概念

这里我们要说明一下媒体流处理中的一个重要概念-时间编码。

时间编码是一个为了视频和音频流的一种辅助的数据。它包含在视频和音频文件中,我们可以理解为时间戳。

SMPTE timecode 是一个SMPTE 时间和控制码的总和,它是一视频和音频流中的连续数字地址桢,标志和附加数据。它被定义在ANSI/SMPTE12-1986。它的目的就是提供一个可用计算机处理的视频和音频地址。

最多SMPTE时间码的数据结构是一个80bit的一桢,它包含下面的内容:

a、  一个hh::mm::ss::ff(小时::分钟::秒::桢)格式的时间戳。

b、  84位的二进制数据通常叫做“用户位”。

c、  不同的标志位

d、  同步序列

e、  效验和

这个格式在DirectShow中被定义为TIMECODE_SAMPLE

时间码分为两种形式,一种是线性的时间格式LTC(纵向编码),在连续时间中每一个时间码就代表一桢。另外一种时间码是VITC(横向编码),它在垂直消隐间隔中储存视频信号的两条线,有些地方在1020之间。

LTC时间码要加到比如录像带中会非常容易,因为它是分离的音频信号编码。但它不能在磁带机暂停、慢进、快进的时候被读取。另外在非专业的录像机中它有可能会丢失一路音频信号。

VITC时间码和LTC不同,它可以在0-15倍速度的时候读取。它还可以从视频捕获卡中读取。但是它要是想被录制到磁带上可能就需要一些别的设备了,通常那些设备比较昂贵。

 <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

SMPTE时间码同时支持有两种模式,一种是非丢桢模式,一种是丢桢模式。在非丢桢模式中,时间码是被连续增长的记录下来。它可以完成时实的播放工作达到30桢,或更高。

NTSC制式的视频播放标准为29.97/ 每秒,这是考虑到单色电视系统的兼容性所致。这就导致一个问提,在非掉桢模式下会导致一个小时会有108桢的不同步,就是真实时间中一个小时的时候,时间码只读了00:59:56:12,当你计算流媒体的播放时间的时候会有一些问题。为了解决这种问题,我们可以在可以容忍的情况下跳桢实现。这种方式的实现是通过在每分钟开始计数的时候跳过两桢但00,20,30,40,50分钟时不跳桢。采用这样的方案我们的网络测试结果每小时误差少于一桢,每24小时误差大概在3桢左右。

在现在的实际工作中,虽然两种模式都被同时提供,但丢桢模式通常被我们采纳。

二、              时间码的典型应用

控制外围设备来进行视频捕获和编辑是一种典型的应用程序。这种应用程序就需要标识视频和音频桢的每一桢,它们使用的方法就是使用SMPTE时间码。线性编辑系统通常会控制三个或者更多的磁带机器,而且还要尽可能的切换视频于光盘刻录机之间。计算机必须精确的执行命令,因此必须要在特定的时间得到录像带指定位置的地址。应用程序使用时间码的方法有很多中,主要有下面这些种:

a、  在整个编辑处理过程中跟踪视频和音频源

b、  同步视频和音频。

c、  同步多个设备

d、  在时间码中使用未定义的字节,叫做:userbits。这里面通常包含日期,ascii码或者电影的工业信息等待。

三、              捕获时间码

通常,时间码是通过一些有产生时间码能力的捕获卡设备来产生的。比如一个rs422就需要时间码来控制外围设备和主机通信。

在时间吗产生以后,我们需要从流格式的视频和音频中获得时间码,这是可以在以后进行访问的。然后我们处理时间码通过下面两步:

a、  建立一个每一桢位置的非连续的索引,将时间码和每一桢一一对应。这个列表是在捕获完成后的文件末尾被写入的。列表可以是一个象下面的这个结构的矩阵数组,为了简明起见,这里提供的只是DirectShowTIMECODE_SAMPLE结构的一个简化。

例如,这里可以给出一个视频捕获流中的时间码:

 

使用了这张表,任何桢的时间码都会很好计算。

       B、还有一种做法就是将时间码作为视频和音频数据写入。这种我们不推荐使用因此不作介绍了。

被写入时间码的文件就可以编辑,复合,同步等操作了。这里就写到这里,对于我们理解时间码已经足够了。其它的很多是关于标准的介绍,大家感兴趣可以参阅一下。

Directshow中的Sample时间戳(Time Stamp)

每个Sample上可以设置两种时间戳:IMediaSample::SetTime和IMediaSample::SetMediaTime。 我们通常讲到时间戳,一般是指前者,它又叫Presenta...
  • coloriy
  • coloriy
  • 2015年07月14日 16:52
  • 1304

DirectShow中的时间戳的简单讲解(zz)

 
  • up2me_gis
  • up2me_gis
  • 2007年05月23日 14:35
  • 841

最简单的基于DirectShow的示例:视频播放器自定义版

本文记录一个简单的基于DirectShow的自定义的视频播放器。这里所说的“自定义播放器”,实际上指的是自己在Filter Graph中手动逐个添加Filter,并且连接这些Filter的后运行的播放...
  • leixiaohua1020
  • leixiaohua1020
  • 2015年01月11日 18:05
  • 10143

关于DirectShow - DirectShow中的时间和时钟

DirectShow编程(3.6) - 关于DirectShow - DirectShow中的时间和时钟 3.6. DirectShow中的时间和时钟    这一节主要概述DirectShow体系中时...
  • levisqin
  • levisqin
  • 2005年08月06日 14:51
  • 4431

Directshow中的时钟(Time and Clocks in Dshow)

Directshow中的时钟(Time and Clocks in Dshow) 智慧的鱼(aoosang)摘要:本篇文档简单介绍了DirectShow中用来标记数据同步的时钟。 在 Filter G...
  • aoosang
  • aoosang
  • 2005年05月25日 16:00
  • 3633

DirectShow Filter 基础与简单的示例程序

DirectShow 是一个 Windows 平台上的流媒体框架,提供了高质量的多媒体流采集和回放功能。 Filter 实质是一个 COM 组件,所以学习开发 Filter 前你应该对 COM 相关...
  • 91program
  • 91program
  • 2014年06月05日 07:32
  • 2445

hive中的分析函数以及时间戳的使用

hive分析函数
  • zhaoxiangchong
  • zhaoxiangchong
  • 2017年11月16日 13:40
  • 117

Qt对directshow的封装

在源码路径中:qt-everywhere-opensource-src-5.1.1\qtmultimedia\src\plugins\directshow, 有两个文件夹player 和 camera...
  • chinabinlang
  • chinabinlang
  • 2014年01月20日 18:28
  • 3644

jsp页面中对时间戳字符串格式化为时间标签

datetag.tld文件:   PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"   "http://java.su...
  • yangshijin1988
  • yangshijin1988
  • 2013年11月22日 18:42
  • 1521

触发器简单实例讲解

触发器简单实例讲解触发器(trigger):监视某种情况,并触发某种操作。触发器创建语法四要素: 监视地点(table) 监视事件(insert/update/delete) 触发时间(after...
  • kkagr
  • kkagr
  • 2017年06月28日 14:22
  • 98
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:DirectShow中的时间戳的简单讲解
举报原因:
原因补充:

(最多只允许输入30个字)