2012-05-15 3 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

Смежные вопросы