2015-06-15 2 views
4

Я пытаюсь записать видео с 3D-анимацией VTK, используя ffmpeg. Пример, который я нашел http://www.itk.org/Wiki/VTK/Examples/Cxx/Video/FFMPEG, для меня немного странный, потому что он не создает рендер, поэтому неясно, как присоединить актеров в этом случае. Итак, мой вопрос: Как соединить vtkRenderer с vtkFFMPEGWriter? Я написал упрощенный пример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, поскольку он доступен на многих платформах по умолчанию.

Смежные вопросы