Python VTK,如何录制视频?
Python VTK, how to record a video?
我正在尝试使用 ffmpeg 录制 VTK 3D 动画视频。我找到的例子 http://www.itk.org/Wiki/VTK/Examples/Cxx/Video/FFMPEG 对我来说有点奇怪,因为它没有创建渲染,所以不清楚在这种情况下如何附加演员。所以,我的问题是 如何将 vtkRenderer
连接到 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(description here)可以轻松解决问题:
windowToImageFilter = vtk.vtkWindowToImageFilter()
windowToImageFilter.SetInput(renWin)
windowToImageFilter.SetInputBufferTypeToRGBA()
windowToImageFilter.ReadFrontBufferOff()
windowToImageFilter.Update()
writer = vtk.vtkAVIWriter()
writer.SetInputConnection(windowToImageFilter.GetOutputPort())
writer.SetFileName("test.avi")
...
使用vtkWindowToImageFilter。当新帧准备就绪时,您必须告诉 电影作者 和 图像过滤器。此外,一些电影作者需要显式调用 end
才能正确完成文件。下面的示例显示了完整的生命周期。
#Setup filter
renWin = vtk.vtkRenderWindow()
imageFilter = vtk.vtkWindowToImageFilter()
imageFilter.SetInput(renWin)
imageFilter.SetInputBufferTypeToRGB()
imageFilter.ReadFrontBufferOff()
imageFilter.Update()
#Setup movie writer
moviewriter = vtk.vtkOggTheoraWriter()
moviewriter.SetInputConnection(windowToImageFilter.GetOutputPort())
moviewriter.SetFileName("movie.ogv")
moviewriter.Start()
renWin.start()
...
#Export a single frame
imageFilter.Modified()
moviewriter.Write()
...
#Finish movie
moviewriter.End()
导出帧的对联可以根据需要多次调用以完成电影。
使用 SetInputBufferTypeToRGB
解决了只出现在我的一个安装中的问题。对于 SetInputBufferTypeToRGBA
,我看到了条带化和多个部分副本。使用 SetInputBufferTypeToRGB
它可以在我尝试过的每台机器上运行。
该示例使用 OggTheora 编码器,因为它在许多平台上默认可用。
我正在尝试使用 ffmpeg 录制 VTK 3D 动画视频。我找到的例子 http://www.itk.org/Wiki/VTK/Examples/Cxx/Video/FFMPEG 对我来说有点奇怪,因为它没有创建渲染,所以不清楚在这种情况下如何附加演员。所以,我的问题是 如何将 vtkRenderer
连接到 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(description here)可以轻松解决问题:
windowToImageFilter = vtk.vtkWindowToImageFilter()
windowToImageFilter.SetInput(renWin)
windowToImageFilter.SetInputBufferTypeToRGBA()
windowToImageFilter.ReadFrontBufferOff()
windowToImageFilter.Update()
writer = vtk.vtkAVIWriter()
writer.SetInputConnection(windowToImageFilter.GetOutputPort())
writer.SetFileName("test.avi")
...
使用vtkWindowToImageFilter。当新帧准备就绪时,您必须告诉 电影作者 和 图像过滤器。此外,一些电影作者需要显式调用 end
才能正确完成文件。下面的示例显示了完整的生命周期。
#Setup filter
renWin = vtk.vtkRenderWindow()
imageFilter = vtk.vtkWindowToImageFilter()
imageFilter.SetInput(renWin)
imageFilter.SetInputBufferTypeToRGB()
imageFilter.ReadFrontBufferOff()
imageFilter.Update()
#Setup movie writer
moviewriter = vtk.vtkOggTheoraWriter()
moviewriter.SetInputConnection(windowToImageFilter.GetOutputPort())
moviewriter.SetFileName("movie.ogv")
moviewriter.Start()
renWin.start()
...
#Export a single frame
imageFilter.Modified()
moviewriter.Write()
...
#Finish movie
moviewriter.End()
导出帧的对联可以根据需要多次调用以完成电影。
使用 SetInputBufferTypeToRGB
解决了只出现在我的一个安装中的问题。对于 SetInputBufferTypeToRGBA
,我看到了条带化和多个部分副本。使用 SetInputBufferTypeToRGB
它可以在我尝试过的每台机器上运行。
该示例使用 OggTheora 编码器,因为它在许多平台上默认可用。