为什么AVIStreamRead什么也没读

Why does AVIStreamRead read nothing?

本文关键字:什么 AVIStreamRead 为什么      更新时间:2023-10-16

我正在编写一个简单的 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不是空的。我会发布更多的代码,但它到处都是乱七八糟的。其他任何地方都没有其他明显的错误,调试器显示所有正确的信息。

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

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