金庆的专栏

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  373 随笔 :: 0 文章 :: 454 评论 :: 0 Trackbacks
WMF SDK例程wmvcopy中的错误

WMF SDK指Microsoft的Windows Media Format SDK,支持以下三大功能:ASF文件的生成(包括ASF数据的流化)、ASF文件的编辑和ASF文件的播放(包括ASF媒体流的播放)。目前版本是WMF SDK9。

wmvcopy是其一个例程,实现了从头部开始截取n秒另存为文件。
我曾对wmvcopy简单修改,实现了从m秒到n秒的截取。见:
windows media format SDK 切割wmv/wma文件

但在使用中发现有些错误。

一个是明显的错误,不能处理大文件,只能截取214秒。见:

请问有大侠发现format SDK 例子 wmvcopy debug error么?

wmvcopy 有个严重的debug error, 在网站找了半天,没有看到有谁提出来。 而且还有一个很奇怪的问题,wmvcopy -i c:\input.wmv -o c:\output.wmv -d 214 没有问题,能正常将input.wmv 剪切为214s output.wmv, 但是wmv -i c:\input.wmv -o c:\output.wmv -d 215 / 216 / 230 都不能正常剪切,output.wmv 就是input.wmv 的copy.
请哪位大侠解释一下?


还 有一个是刚发现的,文件保存结束后,偶尔会崩溃。找个几百K的大文件,截取头部几十秒试试。写个批处理运行一百次,运行中启动关闭一些其它程序,应该会有 一两个报错误出来。(省去一大堆的错误跟踪过程。并且,VC的单步调试可能不会出错。)错误定位在OnTime()的这一语句上:
        HRESULT hr = m_pReaderAdvanced->DeliverTime( m_qwReaderTime );

原来是复制结束后,m_pReaderAdvanced已释放,而m_fEOF还未设置,所以出错。

这样可以让你把错误看的更清楚点:
        assert(m_pReaderAdvanced);
        HRESULT hr = m_pReaderAdvanced->DeliverTime( m_qwReaderTime );

粗略地查看一下wmvcopy的逻辑,OnTime()每次让Reader读取1秒的数据,直到文件结束。
实际情况是,指定了截取的长度,一般都不会到达文件尾部。
所以应该另设一个标志:m_fMaxDuration,到达MaxDuration时就可以结束文件的读取,而不必一直读到文件尾。一可解决崩溃错误,二可提高效率。
posted on 2007-10-29 14:47 金庆 阅读(1328) 评论(3)  编辑 收藏 引用 所属分类: 1. C/C++

评论

# re: WMF SDK例程wmvcopy中的错误 2007-10-29 15:41 guest
不错!  回复  更多评论
  

# re: WMF SDK例程wmvcopy中的错误 2007-11-28 21:09 小蚊子
我想问问就是比如我从截取从30秒到60秒的文件,截取后发现在前几秒钟内只有声音没有图像,不知道为什么?
如知道望回复,本人急用,谢谢了!panaiwen526@sina.com
  回复  更多评论
  

# re: WMF SDK例程wmvcopy中的错误 2007-11-29 09:43 金庆
@小蚊子
应该是与关键帧有关,即没有从关键帧开始截取。我对此没什么好办法。详见另一篇文章的讨论:
http://blog.csdn.net/jq0123/archive/2007/03/23/1538545.aspx#615368  回复  更多评论
  


只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理