0

我正在编写一个简单的 AVI 加载器来从 AVI 文件中获取每一帧并将其保存到 OpenGL 纹理中。我正在使用 VFW,并且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不返回任何错误。在文档中,唯一提到未读取数据的是:

如果 lpBuffer 为 NULL,则该函数不读取任何数据;

lpBuffer不是NULL。我会发布更多代码,但它到处都是乱码。其他任何地方都没有其他明显错误,调试器显示所有正确信息。

4

1 回答 1

1

不同的 AVI 文件使用不同的编解码器进行编码。也许您尝试解码的文件没有 vfw 可以处理的编解码器。

此外,我将从一些工作示例代码开始,然后慢慢修改它以满足我的需要。当涉及到视频时,细节太多了,这使得纯文档几乎无用。

于 2012-05-15T06:17:54.220 回答