Hi All,
Environment:
VTK 8.2
.NET 4.5.2
Windows 10
Using VTK 8.2, the output video from all video writers (vtkAVIWriter, vtkOggTheoraWriter, and my preference vtkFFMPEGWriter) plays too fast. It seems that frame rate is not set correctly since it is always 600 fps. referring to the similar topic in Development section
Cannot modify frame rate for a video using vtkFFMPEGWriter class
seems that pts is not shipped correctly with frame data and therefore timestamps of frames are incorrect to my understanding.
I nailed to temporarily fix the problem, when I changed the renderer, renderWindow, and renderWindowInteractor from OpenGL types to generic defaults ones. But, after few time of building my project in different profiles, the problem returned and persists. Here is the code snippets I am using to render and record. Render works on timer basis, on each render event, video writer and filter update and write.
int Visulization setup()
{
.
.
.
this->isRecording == false
// Create a renderer, render window, and interactor
vtkData->renderer = vtkSmartPointer<vtkRenderer>::New();
vtkData->renderWindow = vtkRenderWindow::New();
vtkData->renderWindowInteractor = vtkRenderWindowInteractor::New();
// Create Writer
vtkData->w2iFilter = vtkWindowToImageFilter::New();
vtkData->w2iFilter->SetInput(vtkData->renderWindow);
vtkData->videoWriter= vtkSmartPointer<vtkFFMPEGWriter>::New();
vtkData->videoWriter->SetFileName("d://animation.avi");
/*vtkData->videoWriter->SetQuality(2);
vtkData->videoWriter->SetRate(15);*/
vtkData->videoWriter->SetInputConnection(vtkData->w2iFilter->GetOutputPort());
.
.
.
}
void RenderWithFrameTimer::RenderCallback()
{
while (!disabled && !closed)
{
this->dispatcher->Invoke(performRenderDelegate);
this->onRenderEvent();
Tasks::Task::Delay(25)->Wait();
}
}
void RenderWithFrameTimer::performRenderDelegate()
{
renderMutex->WaitOne();
if (!disabled && !closed && renderThread->IsAlive)
{
renderWindow->Render();
}
renderMutex->ReleaseMutex();
}
void VtkSimulationWindow::startRecording()
{
if (this->isRecording == false)
{
vtkData->videoWriter->Start();
isRecording = true;
}
}
void VtkSimulationWindow::stopRecording()
{
if (this->isRecording == true)
{
vtkData->videoWriter->End();
isRecording = false;
}
}
void VtkSimulationWindow::onRenderEvent()
{
if (isRecording) {
captureFrame();
}
}
void VtkSimulationWindow::captureFrame()
{
if (this->isRecording == true)
{
vtkData->w2iFilter->Modified();
vtkData->w2iFilter->Update();
vtkData->videoWriter->Write();
}
}
I have also tried to replace the source of data to get directly from renderer using vtkRendererSource, and vtkRenderLargeImage, however, it did not made any difference.