2012-05-15 86 views
0

我正在寫一個簡單的AVI加載程序,以從AVI文件中獲取每個幀並將其保存爲OpenGL紋理。我正在使用VFW,並且AVIStreamRead未返回任何內容。這是我的代碼,抓住每一幀:爲什麼AVIStreamRead什麼都不讀?

void CVideoControl::SetFrame(long frame) 
{ 
    HRESULT result; 
    long bytes, samples; 

    //Update variables 
    m_currentFrame = frame; 
    m_lastFrameChangeMS = gGlobalData->GetLastFrame(); 

    //Get the frame 
    result = AVIStreamRead(m_aviStream, m_currentFrame, 1, m_inputTexture, m_videoAdjustedWidth * m_videoAdjustedHeight * 3, &bytes, &samples); 
    if(FAILED(result)) 
     return; 

    //Decompress the stream 
    if(ICDecompress(m_decompressor, 0, m_inFormat, m_inputTexture, m_outFormat, m_outputTexture) != ICERR_OK) 
     return; 

    //Draw it to the OpenGL texture 
    glBindTexture(GL_TEXTURE_2D, m_videoOutputTexture); 
    glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, m_videoAdjustedWidth, m_videoAdjustedHeight, GL_BGR_EXT, GL_UNSIGNED_BYTE, m_outputTexture); 
} 

可變bytes具有2740的值,並且是samples 1。然而,m_inputTexture是空的。這不是一個糟糕的指針或任何東西,它只是...空着。 AVIStreamRead不會返回任何錯誤。在documentation中,唯一沒有提及的數據是:

如果lpBuffer爲NULL,則此函數不讀取任何數據;

但是lpBuffer不爲NULL。我會發布更多的代碼,但它到處亂跑。在其他地方沒有其他明顯的錯誤,調試器顯示所有正確的信息。

回答

1

不同的AVI文件使用不同的編解碼器進行編碼。也許你試圖解碼的文件沒有可以由vfw處理的編解碼器。

另外我會從一些有效的示例代碼開始,並慢慢修改它以適合我的需要。涉及視頻的細節太多,這使得純粹的文檔大多無用。

+0

我試過了多個視頻。當我使用'ICLocate'來查找解壓縮程序時,它使用有效數據成功。一切運行良好,直到這裏。我會環顧一些樣品,但沒有很多好的樣品。 – smoth190

相關問題