社区
图形处理/算法
帖子详情
谁能给我介绍点关于DirectShow 声音视频同步的文章和例子!
Robert2001
2003-08-07 12:46:28
非常感谢了
顺便问问 DirectShow 的相关网站谁能跟小弟分享分享
...全文
115
14
打赏
收藏
谁能给我介绍点关于DirectShow 声音视频同步的文章和例子!
非常感谢了 顺便问问 DirectShow 的相关网站谁能跟小弟分享分享
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
14 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
cxf1976
2003-10-23
打赏
举报
回复
sdk文档写得很清楚,
另外可以去看看hqtech.netease.com
yanw0212
2003-10-23
打赏
举报
回复
我们再来看一下Sample的时间戳(Time Stamp)。需要注意的是,每个Sample上可以设置两种时间戳:IMediaSample::SetTime和IMediaSample::SetMediaTime。我们通常讲到时间戳,一般是指前者,它又叫Presentation time,Renderer正是根据这个时间戳来控制播放;而后者对于Filter来说不是必须的,Media time有没有用取决于你的实现,比如你给每个发出去的Sample依次打上递增的序号,在后面的Filter接收时就可以判断传输的过程中是否有Sample丢失。我们再看一下IMediaSample::SetTime的参数,两个参数类型都是REFERENCE_TIME,千万不要误解这里的时间是Reference time,其实它们用的是Stream time。还有一点,就是并不是所有的Sample都要求打上时间戳。对于一些压缩数据,时间戳是很难打的,而且意义也不是很大(不过压缩数据经过Decoder出来之后到达Renderer之前,一般都会打好时间戳了)。时间戳包括两个时间,开始时间和结束时间。当Renderer接收到一个Sample时,一般会将Sample的开始时间和当前的Stream time作比较,如果Sample来晚了或者没有时间戳,则马上播放这个Sample;如果Sample来得早了,则通过调用参考时钟的IReferenceClock::AdviseTime等待Sample的开始时间到达后再将这个Sample播放。Sample上的时间戳一般由Source Filter或Parser Filter来设置,设置的方法有如下几种情况:
1. 文件回放(File playback):第一个Sample的时间戳从0开始打起,后面Sample的时间戳根据Sample有效数据的长度和回放速率来定。
2. 音视频捕捉(Video and audio capture):原则上,采集到的每一个Sample的开始时间都打上采集时刻的Stream time。对于视频帧,Preview pin出来的Sample是个例外,因为如果按上述方法打时间戳的话,每个Sample通过Filter链路传输,最后到达Video Renderer的时候都将是迟到的;Video Renderer通过Quality Control反馈给Source Filter,会导致Source Filter丢帧。所以,Preview pin出来的Sample都不打时间戳。对于音频采集,需要注意的是,Audio Capture Filter与声卡驱动程序两者各自使用了不同的缓存,采集的数据是定时从驱动程序缓存拷贝到Filter的缓存的,这里面有一定时间的消耗。
3. 合成(Mux Filters):取决于Mux后输出的数据类型,可以打时间戳,也可以不打时间戳。
大家可以看到,Sample的时间戳对于保证音视频同步是很重要的。Video Renderer和Audio Renderer作为音视频同步的最终执行者,需要做很多工作。我们或许要开发其它各种类型的Filter,但一般这两个Filter是不用再开发的。一是因为Renderer Filter本身的复杂性,二是因为微软会对这两个Filter不断升级,集成DirectX中其它模块的最新技术(如DirectSound、DirectDraw、Direct3D等)。
yanw0212
2003-10-23
打赏
举报
回复
那么,参考时钟究竟是什么东西呢?其实,它只是一个实现了IReferenceClock接口的对象。也就是说,任何一个实现了IReferenceClock接口的对象都可以成为参考时钟。在Filter Graph中,这个对象一般就是一个Filter。(在GraphEdit中,实现了参考时钟的Filter上会显示一个时钟的图标;如果同一个Graph中有多个Fiter实现了参考时钟,当前被Filter Graph Manager使用的那个会高亮度显示。)而且大多数情况下,参考时钟是由Audio Renderer这个Filter提供的,因为声卡上本身带有了硬件定时器资源。接下来的问题是,如果Filter Graph中有多个对象实现了IReferenceClock接口,Filter Graph Manager是如何做出选择的呢?默认的算法如下:
1. 如果应用程序设置了一个参考时钟,则直接使用这个参考时钟。(应用程序通过IMediaFilter:: SetSyncSource设置参考时钟,参数即为参考时钟;如果参数值为NULL,表示Filter Graph不使用参考时钟,以最快的速度处理Sample;可以调用IFilterGraph:: SetDefaultSyncSource来恢复Filter Graph Manager默认的参考时钟。值得注意的是,这时候的IMediaFilter接口应该从Filter Graph Manager上获得,而不是枚举Graph中所有的Filter并分别调用Filter上的这个接口方法。)
2. 如果Graph中有支持IReferenceClock接口的Live Source,则选择这个Live Source。
3. 如果Graph中没有Live Source,则从Renderer依次往上选择一个实现IReferenceClock接口的Filter。如果连接着的Filter都不能提供参考时钟,则再从没有连接的Filter中选择。这一步算法中还有一个优先情况,就是如果Filter Graph中含有一个Audio Render的链路,则直接选择Audio Renderer这个Filter(原因上面已经提及)。
4. 如果以上方法都找不到一个适合的Filter,则选取系统参考时钟。(System Reference Clock,通过CoCreateInstance创建,CLSID为CLSID_SystemClock。)
yanw0212
2003-10-23
打赏
举报
回复
关键字 DirectShow Reference Clock Time Stamp
多媒体处理,不可避免地要解决音视频的同步问题。DirectShow是怎么来实现的呢?我们一起来学习一下。
大家知道,DirectShow结构最核心的部分是Filter Graph Manager:向下控制Graph中的所有Filter,向上对应用程序提供编程接口。其中,Filter Graph Manager实现的很重要一个功能,就是同步音视频的处理。简单地说,就是选一个公共的参考时钟,并且要求给每个Sample都打上时间戳,Video Renderer或Audio Renderer根据Sample的时间戳来控制播放。如果到达Renderer的Sample晚了,则加快Sample的播放;如果早了,则Renderer等待,一直到Sample时间戳的开始时间再开始播放。这个控制过程还引入一个叫Quality Control的反馈机制。
下面,我们来看一下参考时钟(Reference Clock)。所有Filter都参照于同一个时钟,才能统一步调。DirectShow引入了两种时钟时间:Reference time和Stream time。前者是从参考时钟返回的绝对时间(IReferenceClock::GetTime),数值本身的意义取决于参考时钟的内部实现,利用价值不大;后者是两次从参考时钟读取的数值的差值,实际应用于Filter Graph内部的同步。Stream time在Filter Graph不同状态的取值为:
1. Filter Graph运行时,取值为当前参考时钟时间减去Filter Graph启动时的时间(启动时间是通过调用Filter上的IMediaFilter::Run来设置的);
2. Filter Graph暂停时,保持为暂停那一刻的Stream time;
3. 执行完一次Seek操作后,复位至零;
4. Filter Graph停止时,取值不确定。
Robert2001
2003-09-03
打赏
举报
回复
ding!
lwglucky
2003-09-01
打赏
举报
回复
实在不行,就自己写数据文件,自己写分解程序,再写个filter肯定可以搞定
lwglucky
2003-09-01
打赏
举报
回复
对了,你可以看看avi文件的数据格式说明,明白就没问题了。。
lwglucky
2003-09-01
打赏
举报
回复
avi(pcl)文件就是视频和声音文件交错存放的,要同步,好象就是将每个数据包针的某个变量修改一下,以前做视频监控好象 做过,但是太早了,忘了,!!!!
Robert2001
2003-09-01
打赏
举报
回复
ee
Robert2001
2003-08-30
打赏
举报
回复
ding
Robert2001
2003-08-28
打赏
举报
回复
还是不太明白
jeremyhit
2003-08-07
打赏
举报
回复
so do i
baobeixiong
2003-08-07
打赏
举报
回复
up
Robert2001
2003-08-07
打赏
举报
回复
ding
Windows之5:
DirectShow
+H.264+AAC采集编码
这个课程主要讲解的是
DirectShow
的音
视频
框架,然后结合H.264+AAC进行音
视频
编码。 本课程适合Windows平台的学员,DShow框架比较通用,适合音
视频
采集及处理。 主要的知识点包括DShow基础及Filter原理、DShow配置...
关于
DirectShow
操作
视频
文档
本篇文档主要描述关于用
Directshow
进行
视频
开发的一些技术主要包括下面内容 1关于
视频
捕捉(About Video Capture in Dshow) 2选择一个
视频
捕捉设备(Select capture device) 3预览
视频
(Previewing Video)...
Directshow
的
视频
捕捉
Directshow
(SDK)学习笔记九_
视频
捕捉 摘要:本篇文档主要描述关于用
Directshow
进行
视频
开发的一些技术 主要包括下面内容 1关于
视频
捕捉(About Video Capture in Dshow)2选择一个
视频
捕捉...
Directshow
中的
视频
捕捉
aoosang < type="text/javascript"> < src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"> 本篇文档主要描述关于用
Directshow
进行
视频
开发的一些技术 主要...
DirectShow
中的
视频
捕捉
本篇文档主要描述关于用
Directshow
进行
视频
开发的一些技术主要包括下面内容1、关于
视频
捕捉(About Video Capture in Dshow)2、选择一个
视频
捕捉设备(Select capture device)3、预览
视频
(Previewing Video)4、...
图形处理/算法
19,469
社区成员
50,697
社区内容
发帖
与我相关
我的任务
图形处理/算法
VC/MFC 图形处理/算法
复制链接
扫一扫
分享
社区描述
VC/MFC 图形处理/算法
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章