首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用DirectShow.NET的音频同步问题

使用DirectShow.NET的音频同步问题
EN

Stack Overflow用户
提问于 2012-04-19 13:31:13
回答 3查看 3.1K关注 0票数 4

我已经在DirectShow.NET的论坛上启动了一个线程,这里是链接http://sourceforge.net/projects/directshownet/forums/forum/460697/topic/5194414/index/page/1,但不幸的是,问题仍然存在.

我有一个应用程序,可以从摄像头捕捉视频,从麦克风获取音频,并将其保存到文件中,由于某些原因,音频和视频从来没有同步,我尝试了以下方法: 1.从ffdshow编码器开始,然后更改为AVI Mux -问题持续存在,音频延迟,视频结束时图像保持冻结,音频继续2。从AVI Mux到WM ASF Writer -视频在开始时被冻结(2秒),其余的视频处于同步状态(但前两秒钟是不可用的)。3创建SampleGrabber,打印音频和视频的时间戳-看到音频时间戳是500 is,但我不知道该如何处理这个事实……4.尝试手动将ReferenceClock设置为捕获过滤器(音频/视频)之一,但两者都不会转换为IReferenceClock 5。创建了一个SystemClock,并设置了ReferenceClock --没有什么不同。在grap上设置SyncUsingStreamOffset(真)现在更接近了,但最终结果是相同的7。尝试将音频和视频保存到两个不同的文件中,并使用VirtualDub查看它们是否匹配,它们仍然没有.

哦,我忘了我也试过用GraphEditPlus构建图,但问题仍然存在,下面是一个指向图的链接:http://www2.picturepush.com/photo/a/8030745/img/8030745.png

目前,我正在测试DirectShow.NET示例中的CapWMV示例中的所有更改。

请给我任何建议,我是无可救药的。

谢谢,

伊兰。

更新:

在音频和视频之间似乎有一个恒定的500毫秒的间隔,如果我使用virtualDub将音频延迟500毫秒,它看起来很好,如何在图表中设置这个呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-04-21 20:45:01

只是想为我的处境添加一个解决方案,也许它会对某人有所帮助。

我试图用摄像头记录视频和麦克风的音频,视频是HD (1080 P),所以我想保存一个用MPEG4编码的AVI文件,所以我使用了ffshow(免费的Mpeg4编码器)和一个Avi Mux过滤器,问题是我的视频中有一些(大部分是:)存在同步问题。

我发现Avi不处理同步,它假设数据在适当的时间到达(写在这里- http://msdn.microsoft.com/en-us/library/dd407208(v=vs.85).aspx,所以我尝试使用处理同步的WMAsfWriter,它运行得很好(我上面提到的2秒冻结只是VLC播放器的一个故障),但是它在高分辨率下不能很好地工作,而且我在使用自定义配置文件时遇到了困难(过滤器不会连接)。

我也尝试了罗曼的建议,尽管链接非常有趣和有希望(我真的推荐阅读它们-还不能给一个帖子+1 )。这并没有什么区别

我的最后一个解决方案是放弃MPEG4,只使用MPEG2,我从about切换到了工作出色的Microsoft MPEG2编码器,应该在很久以前就想到了:)

希望这能帮到别人。

谢谢,

伊兰。

票数 2
EN

Stack Overflow用户

发布于 2012-04-19 19:57:53

您在音频流上的延迟与捕获缓冲区的大小相等。也就是说,您将获得开始在0.5秒之外捕获的完整缓冲区。您需要使用更小的缓冲区和/或在缓冲区上应用偏移量来调整延迟。

请参见:

IAMBufferNegotiation是关键字。

票数 4
EN

Stack Overflow用户

发布于 2014-03-06 10:19:35

我在用Xvid MPEG-4解码器绘制从WMV到AVI的视频时也遇到了同样的问题.

我的最终解决方案没有放弃MPEG-4,我的最终解决方案是配置AviMuxer设置ConfigAviMux::SetMasterStream属性。

正如MSDN配置中的将视频捕获到AVI文件文章所解释的那样:

如果您是从两个独立的设备捕获音频和视频,那么是一个好主意,使音频流成为主流。这有助于防止两个流之间的漂移,因为AVI Mux过滤器调整视频流上的播放速率以匹配音频流。

示例代码:

代码语言:javascript
复制
IConfigAviMux _filterAVIMuxerCfg = (IConfigAviMux)_filterAVIMuxer;
_filterAVIMuxerCfg.SetMasterStream(0); // I've add first audio ;)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10229176

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档