我正在尝试用ffmpeg录制VTK三维动画的视频。我发现的示例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。当一个新的帧准备好时,你必须告诉电影编剧和图像过滤器。另外,一些电影编剧需要显式调用
end
来正确完成文件。下面的示例显示了整个生命周期。在输出帧的对联可以根据需要多次调用以完成电影。在
使用
SetInputBufferTypeToRGB
修复了仅在我的一个安装中出现的问题。使用SetInputBufferTypeToRGBA
,我看到了条带和多个部分拷贝。使用SetInputBufferTypeToRGB
它在我试过的每台机器上都能正常工作。在该示例使用OggTheora编码器,因为默认情况下,它在许多平台上可用。在
使用vtkWindowToImageFilter(description here)可以很容易地解决该问题:
相关问题 更多 >
编程相关推荐