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時就可以結束文件的讀取,而不必一直讀到文件尾。一可解決崩潰錯誤,二可提高效率。
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時就可以結束文件的讀取,而不必一直讀到文件尾。一可解決崩潰錯誤,二可提高效率。