DirectShow 时间戳
2021-02-26
159
0
时间戳定义媒体样本的开始和完成时间,以流时间为单位。时间戳有时称为渲染时间。阅读本文其余部分时,重要的是要记住,并非所有格式都以相同的方式使用时间戳。例如,并非所有MPEG样本都带有时间戳。在MPEG滤波器图中,时间戳不应用于每一帧,直到它们从解码器输出。
渲染器过滤器接收到Sample时,会根据时间戳安排渲染。如果样本延迟到达,或者没有时间戳,过滤器会立即呈现样本。否则,过滤器将等待Sample的开始时间,然后再渲染Sample。(它通过调用ireferencelock::advisiontime方法等待开始时间。)
源过滤器和解析器过滤器负责在它们处理的Sample上设置正确的时间戳。使用以下准则。
- 文件回放:第一个样本带有时间戳,开始时间为零。随后的时间戳由采样长度和回放速率决定,而回放速率本身由文件格式决定。解析文件的过滤器负责计算正确的时间戳(例如,AVI拆分器)。
- 视频和音频捕获:每个样本都有一个时间戳,其开始时间等于捕获时的流时间,注意如下:
- 来自预览插针(与捕获插针相反)的视频帧没有时间戳。由于图形延迟的原因,带有捕获时间戳的视频帧在视频渲染器中总是延迟到达。这可能会导致渲染器为了进行质量控制而丢弃帧。有关质量控制的信息,请参阅质量控制管理。
- 音频捕获:音频捕获过滤器使用自己的一组缓冲区,这些缓冲区与音频驱动程序使用的缓冲区是分开的。音频驱动程序以固定的间隔填充捕获过滤器的缓冲区。间隔取决于驱动程序,但一般不超过10毫秒。音频样本上的时间戳反映了驱动程序填充音频捕获过滤器缓冲区的时间。这些时间可能有点不准确,特别是当应用程序使用非常小的缓冲区时。然而,媒体时间将准确地反映缓冲区中音频样本的数量。
- Mux过滤器:根据输出格式,Mux过滤器可能需要生成时间戳,也可能不需要。例如,AVI文件格式使用没有时间戳的固定帧速率,因此AVI Mux过滤器假设样本到达的时间大致正确。但是,如果传入的时间戳显示的间隔大于一帧,则AVI Mux将写入一个大小为零的索引项,以指示丢弃的帧。在文件回放时,在运行时生成新的时间戳,如前所述。
要设置样本的时间戳,请调用IMediaSample::SetTime方法。
媒体时间
过滤器还可以为Sample指定媒体时间。在视频流中,媒体时间表示帧编号。在音频流中,媒体时间表示数据包中的Sample号。例如,如果每个分组包含1秒的44.1千赫(kHz)音频,则第一分组具有0的媒体开始时间和44100的媒体停止时间。在可查找的流中,媒体时间总是相对于流的开始时间。例如,假设您从一个每秒15帧的视频流开始寻找2秒。则第一个媒体样本的时间戳为0,但媒体时间为30。
渲染器和mux过滤器可以通过检查间隙来使用媒体时间来确定帧或采样是否已被丢弃。但是,设置介质时间不需要过滤器。要设置示例的媒体时间,请调用IMediaSample::SetMediaTime方法。
HID人机交互QQ群:564808376
UAC音频QQ群:218581009
UVC相机QQ群:331552032
BOT&UASP大容量存储QQ群:258159197
STC-USB单片机QQ群:315457461
USB技术交流QQ群2:580684376
USB技术交流QQ群:952873936