2010-04-28 48 views
0

我正在使用帧捕获器类来捕获和处理视频中的每个帧。该类可以在这里找到:http://www.codeproject.com/KB/graphics/FrameGrabber.aspx堆栈溢出Marshal.PtrToStructure读取wmv文件

但是,我遇到问题。加载文件时,它会尝试将视频格式指针编组为VideoInfoHeader(我正在使用DirectShow.Net)。执行此代码如下:

videoInfo = (VideoInfoHeader)Marshal.PtrToStructure(mediaType.formatPtr, typeof(VideoInfoHeader)); 

当我运行这一点,立即崩溃了调试环境,可能与堆栈溢出。当我逐步了解时,我可以看到formatPtr总是等于93,但我不知道该怎么做,因为我对编组相当陌生。

我已检查视频在Windows Media Player中正常运行。

这对于查找视频的尺寸以及标题的大小非常重要,在读取帧之前需要跳过该标题的大小。

我正在运行Windows 7 x64。

任何帮助,将不胜感激,我必须尝试了十五种不同的帧抓取技术。

+1

“可能带有堆栈溢出”:是否有可能发布异常的完整堆栈跟踪?你是如何推断这个问题是堆栈溢出的? – 2010-04-28 23:08:55

+0

93?这当然听起来不像一个有效的内存指针。 – 2010-04-29 00:00:41

+0

我只能显示该行运行前的堆栈跟踪,它是: vidanal.exe!User.DirectShow.FrameGrabber.FileName.set(string value =“XXX \\ test.wmv”)第35行+ 0xf字节\t C# \t vidanal.exe!vidanal.Form1.button1_Click(object sender = {Text =“button1”},System.EventArgs e = {X = 39 Y = 9 Button = Left})Line 167 + 0x2c bytes \t C# \t [外部代码] \t \t vidanal.exe!vidanal.Program.Main()线18 + 0×28字节\t C# \t [外部代码] – 2010-04-29 01:10:01

回答

2

也许你的mediaType结构变坏了,你打电话之前检查它的内容吗?它在哪里填充?

另外我建议在WinDbg下运行你的应用程序。你可以找到那里发生了什么。

如果您是新手,请尝试阅读Tess Ferrandez's Blog。还有很多关于使用WinDbg进行调试的信息,只是搜索。

+0

谢谢,我会试试看。 – 2010-04-29 04:28:23