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
соответственно, чтобы перепрыгнуть через кадры, пропустить.