AVI, созданный с помощью AVIStreamWrite, имеет неверную длину и скорость воспроизведения

Я пытаюсь записать файл AVI с помощью AVIStreamWrite, но полученный файл avi немного запутался. Изображения в avi содержат правильное изображение и цвета, но длительность и скорость видео отключены. Я записал видео, которое должно было длиться около 7 секунд, и, глядя на свойства файла в проводнике Windows, он показал, что его продолжительность составляет около 2 секунд. Когда я проигрывал его в Media Player, он был слишком коротким и, казалось, играл очень быстро (движение в видео было похоже на ускоренную перемотку вперед). Я также не могу искать в видео с помощью Media Player. Вот что я делаю...

// инициализация

HRESULT AVIWriter::Init()
{
HRESULT hr = S_OK;
_hAVIFile = NULL;
_videoStream = NULL;


_frameCount = 0;
AVIFileInit();

::DeleteFileW(_filename);

hr = AVIFileOpen(&_hAVIFile,_filename,OF_WRITE|OF_CREATE, NULL);
if (hr != AVIERR_OK)
{
    ::cout << "AVI ERROR";
    return 0;
}
/**************************************/
// Create a raw video stream in the file
::ZeroMemory(&_streamInfo, sizeof(_streamInfo));
_streamInfo.fccType                = streamtypeVIDEO;    // stream type
_streamInfo.fccHandler             = 0;                  // No compressor
_streamInfo.dwScale                = 1;                                       
_streamInfo.dwRate                 = _aviFps;   //this is 30
_streamInfo.dwSuggestedBufferSize  = 0;
_streamInfo.dwSampleSize = 0;
SetRect( &_streamInfo.rcFrame, 0, 0,_bmi.biWidth , _bmi.biHeight );

hr = AVIFileCreateStream(   _hAVIFile,      // file pointer
                            &_videoStream,// returned stream pointer
                            &_streamInfo);  // stream header

hr = AVIStreamSetFormat(_videoStream, 0,
                            &_bmi,   
                            sizeof(_bmi));

return hr;
}

// вызвать это, когда я получаю кадр от моей камеры

HRESULT AVIWriter::AddFrameToAVI(BYTE* buffer)
{ 
HRESULT hr;
long size = _bmi.biHeight * _bmi.biWidth * 3;

hr = AVIStreamWrite(_videoStream,           // stream pointer
                _frameCount++,              // time of this frame
                1,                      // number to write
                buffer, // pointer to data
                size,// size of this frame
                AVIIF_KEYFRAME,         // flags....
                NULL,
                NULL);  

return hr;

}

// позвони, когда я закончу

    void AVIWriter::CloseAVI()

   {
    AVIStreamClose(_videoStream);
    AVIFileClose(_hAVIFile);
    AVIFileExit();

    }

Теперь в качестве теста я использовал GraphEdit DirectShow для создания графика, состоящего из фильтра VideoCapture для этой же камеры и мультиплексора AVI, и создал файл AVI. Полученный файл AVI был в порядке. Частота кадров составляла 30 кадров в секунду, то же самое, что я использую. Я запросил оба avi-файла (мой "плохой" и "хороший", созданный с помощью GraphEdit), используя вызов AVIStreamInfo, и информация о потоке была почти одинаковой для обоих файлов. Я ожидал, что отсчетов в секунду или количества кадров будет недостаточно для моего "плохого" avi, но это не так. Я делаю что-то неправильно, из-за чего мой AVI имеет неправильную длину и воспроизводится с повышенной скоростью? Я новичок в использовании VFW, поэтому любая помощь приветствуется. Спасибо

1 ответ

Решение

Время кадра в завещании в итоге будет _frameCount / _aviFpsтак что либо вы сбрасываете свои кадры, а они не доходят AVIStreamWriteили, если вы предпочитаете пропустить несколько кадров в файле, вам нужно увеличить _frameCount соответственно, чтобы перепрыгнуть через кадры, пропустить.

Другие вопросы по тегам