Tecplot’s avi use broken windows codecs
For those of you that use tecplot, you know that while the interface is fairly straightforward and the resulting visuals look pretty good, tecplot has one major flaw. The animations are generated in with essentially the MSRLE codec from a decade ago. The codec’s color palette generally cannot handle continuous color flooding in tecplot; if you try to open it up on other machines or convert them to say flash video or mp4, you will find that the the colors are all messed up. Sometimes the frame size in tecplot causes the video to not display correctly.
So to fix this issue, I found out that the swf output actually works correctly. Modifying the previous pbox2avi script, I created a tecplot specific script to generate mpeg’s or whatever else ffmpeg can spit out. The script is pretty much a more rudimentary version of pbox2avi.py.
Requirements: swftools, ffmpeg
Download tecplot2mpeg.py.
As usual the code for the script is below:
# Copyright 2010 Jonathan Wong # python script to convert SWF files generated from tecplot to mpeg #requires swfextract import commands,sys,re,math def parse(filename): #check filename for .swf extension if not filename.find('.swf'): # not a comprehensive check return fileprefix = filename[0:filename.find('.swf')] commands.getstatusoutput("rm %s.mpeg" % (fileprefix,)) #open file status, output = commands.getstatusoutput("swfextract %s" % (filename,)) print output #find "JPEGs: ID(s)" slide_identifier = "PNGs: ID(s)" start=output.find(slide_identifier) slide_extract=[] if start: start += len(slide_identifier)+1 slide_end = output.find("[-f]",start) print start,slide_end slide_extract=output[start:slide_end-2].replace(" ","") # now extract all the data print "swfextract %s -P -p %s" % (filename,slide_extract) slides = slide_extract.split(",") digits = 1 + int(math.log10(int(slides[-1]))) for slide in slides: print "Processing frame: %d" % (int(int(slide)/2)+1,) print ("swfextract %%s -p %%s & mv output.png %s%%0%dd.png" % (fileprefix,digits,)) % (filename,slide,int(int(slide)/2)+1) status, output = commands.getstatusoutput(("swfextract %%s -p %%s && mv output.png %s%%0%dd.png" % (fileprefix,digits,)) % (filename,slide,int(int(slide)/2)+1)) status, output = commands.getstatusoutput("ffmpeg -f image2 -i %s%%04d.png -b 600k %s.mpeg && rm %s*.png" % (fileprefix,fileprefix,fileprefix)) return slide_extract if __name__=="__main__": slides=parse(sys.argv[1]) |