Python VTK,如何录制视频?

Python VTK,如何录制视频?,python,video,ffmpeg,vtk,Python,Video,Ffmpeg,Vtk,我正在尝试使用ffmpeg录制VTK 3D动画的视频。我发现的示例对我来说有点奇怪,因为它不创建渲染,所以不清楚在这种情况下如何附加角色。所以,我的问题是如何将vtkrender连接到vtkFFMPEGWriter?我写了一个简化的例子 import vtk # draw a plane plane_source = vtk.vtkPlaneSource() plane_source.SetCenter(0, 0, 0) plane_source.SetNormal(0, 0, 1) plan

我正在尝试使用ffmpeg录制VTK 3D动画的视频。我发现的示例对我来说有点奇怪,因为它不创建渲染,所以不清楚在这种情况下如何附加角色。所以,我的问题是如何将
vtkrender
连接到
vtkFFMPEGWriter
?我写了一个简化的例子

import vtk

# draw a plane
plane_source = vtk.vtkPlaneSource()
plane_source.SetCenter(0, 0, 0)
plane_source.SetNormal(0, 0, 1)
plane_mapper = vtk.vtkPolyDataMapper()
plane_mapper.SetInput(plane_source.GetOutput())
plane_actor = vtk.vtkActor()
plane_actor.SetMapper(plane_mapper)

# create render
render = vtk.vtkRenderer()
renWin = vtk.vtkRenderWindow()
renWin.AddRenderer(render)
renWin.SetSize(800, 600)
renInter = vtk.vtkRenderWindowInteractor()
renInter.SetRenderWindow(renWin)
render.AddActor(plane_actor)
renWin.Render()
renInter.Initialize()

# set callback
def cb(interactor, event):
    global plane_actor
    plane_actor.RotateZ(0.1)
    interactor.GetRenderWindow().Render()

renInter.AddObserver('TimerEvent', cb)
timerId = renInter.CreateRepeatingTimer(100);

# put something here?
writer = vtk.vtkFFMPEGWriter()
# ??? writer.SetInputConnection(...)
writer.SetFileName("test.avi")
writer.Start()

# run
renInter.Start()

使用vtkWindowToImageFilter()可以轻松解决此问题:

使用。当新帧准备好时,您必须告诉电影编写器和图像过滤器。此外,一些电影编剧需要显式调用
end
,才能正确完成文件。下面的示例显示了整个生命周期

#设置过滤器
renWin=vtk.vtkRenderWindow()
imageFilter=vtk.vtkWindowToImageFilter()
imageFilter.SetInput(renWin)
imageFilter.SetInputBufferTypeToRGB()
imageFilter.ReadFrontBufferOff()
imageFilter.Update()
#设置电影编剧
moviewriter=vtk.vtkOggTheoraWriter()
moviewriter.SetInputConnection(windowToImageFilter.GetOutputPort())
moviewriter.SetFileName(“movie.ogv”)
电影编剧
renWin.start()
...
#导出单个帧
imageFilter.Modified()
电影编剧
...
#完成电影
电影编剧
输出帧的对联可以根据需要多次调用以完成电影

使用
SetInputBufferTypeToRGB
修复了仅在我的一次安装中出现的问题。使用
SetInputBufferTypeToRGBA
,我看到了条带和多个部分拷贝。使用
SetInputBufferTypeToRGB
它可以在我尝试的每台机器上运行

该示例使用OggTheora编码器,因为默认情况下它在许多平台上都可用

windowToImageFilter = vtk.vtkWindowToImageFilter()
windowToImageFilter.SetInput(renWin)
windowToImageFilter.SetInputBufferTypeToRGBA()
windowToImageFilter.ReadFrontBufferOff()
windowToImageFilter.Update()

writer = vtk.vtkAVIWriter()
writer.SetInputConnection(windowToImageFilter.GetOutputPort())
writer.SetFileName("test.avi")
...