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时就可以结束文件的读取,而不必一直读到文件尾。一可解决崩溃错误,二可提高效率。