Thursday, March 18, 2010

3d animation: circular hatch mechanism

A circular hatch opening and closing. The animation uses constraints to get the motion of the leaves. The exploded view is animated into an assembled view where pieces come together into the functioning system. It illustrates very clearly the shapes of the components involved and their interactions. Blender 3d used for modeling, animating and rendering.


Monday, March 15, 2010

Applescript to process multiple video files with ffmpeg

This code is an Applescript intended to be used along with folder actions to batch convert files dropped in a folder using ffmpeg.
Background: Muxed video files are problematic when edited and the mpeg codec is also not easy in a Mac. Some Sony cameras record muxed mpg video, which requires processing every file in order to further work with them, doing this manually can be boring and take forever.
The following program demuxes and changes codec to h264, maintaining the file creation date. Without alteration, it will only be useful if working with files created on a DSCW100, to convert other files, changes need to be made to the ffmpeg shell command parameters. It handles spaces in filenames but folders should be kept without spaces or code will again need to be changed.
The program is separated in useful functions including extracting path, filename, extension; change creation date, convert scientific notation to text string. Provided without any warranty, use at your own risk.

(*

Convert MPG files in a folder to h264 using ffmpeg (ffmpegx).

March 2010 Fp www.designeddrawnmade.blogspot.com

Requires ffmpegX to exist in /Applications/ffmpegX_0.0.9y/ffmpegX.app

Derived from Apple sample code, etc.

*)


property done_foldername : "Done"

property extension_list : {"mpeg", "mpg", "MPG", "MPEG"}


on adding folder items to this_folder after receiving these_items

tell application "Finder"

if not (exists folder done_foldername of this_folder) then

make new folder at this_folder with properties {name:done_foldername}

end if

end tell

try

repeat with i from 1 to number of items in these_items

set this_item to item i of these_items

set ff_Path to "/Applications/ffmpegX_0.0.9y/ffmpegX.app//Contents/Resources/" as string

set this_item_posix to the POSIX path of this_item

set pathOnly to path_only(this_item_posix)

set name_wExt to remove_path(this_item_posix)

set nameOnly to remove_extension(name_wExt)

set file_extension to get_extension(this_item)

set temp_filename to pathOnly & "Done/" & nameOnly

set temp_filename to quoted form of temp_filename

set this_item_posix_q to quoted form of this_item_posix

if file_extension is not in the extension_list then

do shell script "cp " & this_item_posix_q & " " & pathOnly & "Done/"

set finalfile to pathOnly & "Done/" & name_wExt

change_dates(this_item, finalfile)

do shell script "rm " & this_item_posix_q

else

-- display dialog "variables" & return & return & pathOnly & return & nameOnly & return & file_extension & return & temp_filename & return & name_wExt

do shell script ff_Path & "ffmpeg -i " & this_item_posix_q & " -an -f yuv4mpegpipe - | " & ff_Path & "x264 -v --no-cabac -b 0 --qpmin 22 --qpmax 51 -B 5100 --me hex --threads 2 --level 13 --fps 30000/1001 -o " & temp_filename & ".ff.video.mp4 - 640x480 "

do shell script ff_Path & "ffmpeg -i " & temp_filename & ".ff.video.mp4 -i " & this_item_posix_q & " -y -vn -f mp4 -acodec aac -ab 128 -ar 44100 -ac 2 -map 1.0:0.0 " & temp_filename & ".ff.audio.mp4 "

do shell script ff_Path & "mp4box -add " & temp_filename & ".ff.video.mp4 -add " & temp_filename & ".ff.audio.mp4 -new " & temp_filename & ".ff.mp4"

do shell script "rm " & temp_filename & ".ff.video.mp4 && rm " & temp_filename & ".ff.audio.mp4"

set finalfile to pathOnly & "Done/" & nameOnly & ".ff.mp4"

change_dates(this_item, finalfile)

end if

end repeat

end try

end adding folder items to


on get_extension(this_item)

tell application "Finder" to set file_extension to the name extension of this_item

end get_extension


on remove_path(this_name)

repeat while this_name contains "/"

set x to the offset of "/" in this_name

set this_name to (text (x + 1) thru -1 of this_name)

end repeat

return this_name

end remove_path


on path_only(this_name)

if this_name contains "/" then

set this_name to (the reverse of every character of this_name) as string

set x to the offset of "/" in this_name

set this_name to (text (x) thru -1 of this_name)

set this_name to (the reverse of every character of this_name) as string

end if

return this_name

end path_only


on remove_extension(this_name)

if this_name contains "." then

set this_name to (the reverse of every character of this_name) as string

set x to the offset of "." in this_name

set this_name to (text (x + 1) thru -1 of this_name)

set this_name to (the reverse of every character of this_name) as string

end if

return this_name

end remove_extension


on change_dates(oldfile, file_)

tell application "Finder" to set old_date to the creation date of file oldfile

set {year:y, month:m, day:d, hours:hh, minutes:mm} to (old_date)

set old_date to y * 100000000 + m * 1000000 + d * 10000 + hh * 100 + mm

set old_date_string to remove_scientific(old_date)

set file_ to POSIX path of file_

do shell script "touch -t " & old_date_string & " " & quoted form of file_

end change_dates


on remove_scientific(this_number)

set this_number to this_number as string

if this_number contains "E" then

set this_number to (the reverse of every character of this_number) as string

set x to the offset of "E" in this_number

set this_number to (text (x + 1) thru -1 of this_number)

set this_number to (the reverse of every character of this_number) as string

end if

if this_number contains "." then

set this_number to (the reverse of every character of this_number) as string

set y to the offset of "." in this_number

set timepartA to (text (y + 1) thru -1 of this_number)

set this_number to (the reverse of every character of this_number) as string

set z to the offset of "." in this_number

set timepartB to (text (z + 1) thru -1 of this_number)

end if

set new_number to timepartA & timepartB

return new_number

end remove_scientific



links:
http://www.macosxhints.com/article.php?story=20060703160750583
http://www.macosxautomation.com/applescript/sbrt/sbrt-02.html
http://devdaily.com/blog/post/mac-os-x/applescript-concatenate-strings
http://www.gregwalsh.com/articles/applescript_flv.htm
http://www.macosxautomation.com/applescript/resources.html

Monday, March 1, 2010

Chrome Mirrors and glass rendering




Blender3d rendering reflective and transparent objects: water taps and glass string. Click on image for desktop friendly version (1280x800).