2015-06-15 41 views
4

我想使用ffmpeg錄製VTK 3D動畫的視頻。我發現http://www.itk.org/Wiki/VTK/Examples/Cxx/Video/FFMPEG的例子對我來說有點奇怪,因爲它不創建渲染,所以在這種情況下如何附加演員並不清楚。所以,我的問題是如何連接vtkRenderervtkFFMPEGWriter?我寫了一個簡單的例子Python VTK,如何錄製視頻?

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() 

回答

4

這個問題可以通過使用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") 
... 
2

使用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編碼器,因爲默認情況下它在許多平臺上都可用。