Blenderで動画作った際の副産物置き場。
- EC2向けのネットワークレンダ用サービススクリプト
- Blenderマクロ(Python)
- OpenEXR連番から動画作成
Blenderで動画作った際の副産物置き場。
| # AddBpmBasedMarkers.py | |
| # resolution=1: | |
| # b1 b2 b3 b4 | |
| # resolution=4: | |
| # b1 - - - b2 - - - b3 - - - b4 - - - | |
| import numpy as np | |
| import bpy | |
| fps = bpy.context.scene.render.fps | |
| bpm = 140 # required 1/5 | |
| bps = bpm / 60 | |
| fpb = fps / bps | |
| resolution = 2 # required 2/5 | |
| frame_begin = 6 # required 3/5 | |
| frame_end = 800 # required 4/5 | |
| frame_step = fpb / resolution | |
| # set initial offset | |
| #frame_begin = frame_begin | |
| frame_begin = frame_begin + (fpb / 2) # required 5/5 | |
| beat_count = 1 | |
| default_areatype = bpy.context.area.type | |
| bpy.context.area.type = 'TIMELINE' | |
| for f in np.arange(frame_begin, frame_end, frame_step): | |
| bar, beat = divmod(beat_count - 1, resolution) | |
| bar += 1 | |
| beat += 1 | |
| if beat == 1: | |
| marker_name = "b{}".format(bar) | |
| else: | |
| marker_name = "-" | |
| bpy.context.scene.frame_set(round(f, 4)) | |
| bpy.ops.marker.add() | |
| bpy.ops.marker.rename(name=marker_name) | |
| beat_count += 1 | |
| bpy.context.area.type = default_areatype | |
| # CopyActiveCameraLocation1_Dynamic.py | |
| import bpy | |
| def copy_active_camera_location(scene): | |
| target_name="EyeTarget" | |
| if target_name in bpy.data.objects: | |
| bpy.data.objects[target_name].location = scene.camera.matrix_world.translation | |
| #bpy.data.objects[target_name].keyframe_insert(data_path='location') # Dirty Bake | |
| bpy.app.handlers.frame_change_post.append(copy_active_camera_location) |
| # CopyActiveCameraLocation2_Static.py | |
| import bpy | |
| def frame_range(s, e): | |
| return range(s, e + 1) | |
| scene = bpy.context.scene | |
| target_name="EyeTarget" | |
| start = scene.frame_start | |
| end = scene.frame_end | |
| target_range = frame_range(start, end) | |
| ignore_ranges = ( | |
| frame_range(2988, 3193), | |
| frame_range(5671, 6040) | |
| ) | |
| if target_name in bpy.data.objects: | |
| target = bpy.data.objects[target_name] | |
| for i in target_range: | |
| ignore_frame = False | |
| for ignore_range in ignore_ranges: | |
| if i in ignore_range: | |
| ignore_frame = True | |
| break | |
| if not ignore_frame: | |
| scene.frame_set(i) | |
| target.location = scene.camera.matrix_world.translation | |
| target.keyframe_insert(data_path='location') # Bake |
| set BIN_DJV_CONVERT="C:\Program Files\djv-1.0.5-Windows-64\bin\djv_convert" | |
| set BIN_PNG2YUV="C:\work\mjpegtools-2.1.0-mingw-bin\bin\png2yuv" | |
| set BIN_FFMPEG="C:\work\ffmpeg-20150115-git-cd960c8-win64-static\bin\ffmpeg" | |
| set RENDER_RESULT_DIR=F:\blender\render_result | |
| set PROJECT_NAME=SweetLogic_Finish | |
| set OUTPUT_DIR=%RENDER_RESULT_DIR%\%PROJECT_NAME% | |
| mkdir %OUTPUT_DIR% | |
| set FPS=30 | |
| set FRAME_START=1 | |
| set FRAME_COUNT=6500 | |
| set FRAME_NAMING=%%06d.png | |
| set AUDIO_INPUT=c:\work\SweetLogic_add30fps5framesilence.wav | |
| cd /d %OUTPUT_DIR% | |
| : OpenEXR Seq -> PNG Seq | |
| : http://djv.sourceforge.net/djv_convert.html | |
| :%BIN_DJV_CONVERT% 000001-006500.exr 000001.png -layer "RenderLayer.Combined.R,G,B,A" | |
| %BIN_DJV_CONVERT% 000001-006500.exr 000001.png -layer "Composite.Combined.R,G,B,A" | |
| : PNG Seq -> YUV and YUV -> Webm Lossless | |
| :%BIN_PNG2YUV% -I p -f %FPS% -b 1 -n %FRAME_COUNT% -j "%OUTPUT_DIR%\%FRAME_NAMING%" > "%OUTPUT_DIR%\out.yuv" | |
| :%BIN_FFMPEG% -i "%OUTPUT_DIR%\out.yuv" -i "%AUDIO_INPUT%" -map 0:0 -map 1:0 -c:v libvpx-vp9 -lossless 1 -qmax 0 -qmin 0 -c:a libvorbis -q:a 4 %OUTPUT_DIR%\out.webm | |
| : PNG Seq -> Webm Lossless | |
| :%BIN_FFMPEG% -f image2 -start_number %FRAME_START% -i -r %FPS% "%OUTPUT_DIR%\%FRAME_NAMING%" -i "%AUDIO_INPUT%" -map 0:0 -map 1:0 -c:v libvpx-vp9 -lossless 1 -qmax 0 -qmin 0 -c:a libvorbis -q:a 4 %OUTPUT_DIR%\out.webm | |
| : PNG Seq -> H264 Lossless | |
| %BIN_FFMPEG% -f image2 -start_number %FRAME_START% -r %FPS% -i "%OUTPUT_DIR%\%FRAME_NAMING%" -i "%AUDIO_INPUT%" -map 0:0 -map 1:0 -c:v libx264 -qp:v 0 -c:a aac -b:a 240k -strict -2 %OUTPUT_DIR%\out.mp4 | |
| : PNG Seq -> H264 CRF Slow | |
| :%BIN_FFMPEG% -f image2 -start_number %FRAME_START% -r %FPS% -i "%OUTPUT_DIR%\%FRAME_NAMING%" -i "%AUDIO_INPUT%" -map 0:0 -map 1:0 -c:v libx264 -preset:v slow -crf:v 22 -c:a aac -b:a 240k -strict -2 %OUTPUT_DIR%\out_lossy.mp4 | |
| cd /d %RENDER_RESULT_DIR% | |
| echo done |
| RPATH=/mnt/my-data | |
| BIN_BLENDER=${RPATH}/blender-2.73a-linux-glibc211-x86_64/blender | |
| cd ${RPATH} | |
| ${BIN_BLENDER} -b simple_master.blend --addons netrender -a -noaudio -nojoystick --enable-autoexec | |
| set TITLE=blender-slave-mild | |
| set BIN=C:\Program Files\Blender Foundation\Blender\blender.exe | |
| set OPTIONS=-b simple_slave.blend --addons netrender -a -noaudio -nojoystick --enable-autoexec | |
| : Set CPU affinity mask | |
| set AFFINITY_MASK_BINARY=00001111 | |
| for /f %%i in ('python -c "print(0b%AFFINITY_MASK_BINARY%)"') do set AFFINITY_MASK_DECIMAL=%%i | |
| start /affinity %AFFINITY_MASK_DECIMAL% "%TITLE%" "%BIN%" %OPTIONS% |
| RPATH=/mnt/my-data | |
| BIN_BLENDER=${RPATH}/blender-2.73a-linux-glibc211-x86_64/blender | |
| cd ${RPATH} | |
| ${BIN_BLENDER} -b simple_slave_eiptarget.blend --addons netrender -a -noaudio -nojoystick --enable-autoexec | |
| #!/bin/sh | |
| ### BEGIN INIT INFO | |
| # Provides: netrender-master | |
| # Required-Start: $local_fs $network $named $time $syslog | |
| # Required-Stop: $local_fs $network $named $time $syslog | |
| # Default-Start: 2 3 4 5 | |
| # Default-Stop: 0 1 6 | |
| # Description: Blender\ NetRender\ Slave | |
| ### END INIT INFO | |
| SCRIPT=/mnt/my-data/netrender-master.sh | |
| RUNAS=ec2-user | |
| PIDFILE=/var/run/netrender-master.pid | |
| LOGFILE=/var/log/netrender-master.log | |
| start() { | |
| if [ -f /var/run/$PIDNAME ] && kill -0 $(cat /var/run/$PIDNAME); then | |
| echo 'Service already running' >&2 | |
| return 1 | |
| fi | |
| echo 'Starting service…' >&2 | |
| local CMD="$SCRIPT &> \"$LOGFILE\" & echo \$!" | |
| su -c "$CMD" $RUNAS > "$PIDFILE" | |
| echo 'Service started' >&2 | |
| } | |
| stop() { | |
| if [ ! -f "$PIDFILE" ] || ! kill -0 $(cat "$PIDFILE"); then | |
| echo 'Service not running' >&2 | |
| return 1 | |
| fi | |
| echo 'Stopping service…' >&2 | |
| kill -15 $(cat "$PIDFILE") && rm -f "$PIDFILE" | |
| echo 'Service stopped' >&2 | |
| } | |
| uninstall() { | |
| echo -n "Are you really sure you want to uninstall this service? That cannot be undone. [yes|No] " | |
| local SURE | |
| read SURE | |
| if [ "$SURE" = "yes" ]; then | |
| stop | |
| rm -f "$PIDFILE" | |
| echo "Notice: log file is not be removed: '$LOGFILE'" >&2 | |
| update-rc.d -f netrender-master remove | |
| rm -fv "$0" | |
| fi | |
| } | |
| case "$1" in | |
| start) | |
| start | |
| ;; | |
| stop) | |
| stop | |
| ;; | |
| uninstall) | |
| uninstall | |
| ;; | |
| restart) | |
| stop | |
| start | |
| ;; | |
| *) | |
| echo "Usage: $0 {start|stop|restart|uninstall}" | |
| esac |
| #!/bin/sh | |
| ### BEGIN INIT INFO | |
| # Provides: netrender-slave | |
| # Required-Start: $local_fs $network $named $time $syslog | |
| # Required-Stop: $local_fs $network $named $time $syslog | |
| # Default-Start: 2 3 4 5 | |
| # Default-Stop: 0 1 6 | |
| # Description: Blender\ NetRender\ Slave | |
| ### END INIT INFO | |
| SCRIPT=/mnt/my-data/netrender-slave.sh | |
| RUNAS=ec2-user | |
| PIDFILE=/var/run/netrender-slave.pid | |
| LOGFILE=/var/log/netrender-slave.log | |
| start() { | |
| if [ -f /var/run/$PIDNAME ] && kill -0 $(cat /var/run/$PIDNAME); then | |
| echo 'Service already running' >&2 | |
| return 1 | |
| fi | |
| echo 'Starting service…' >&2 | |
| local CMD="$SCRIPT &> \"$LOGFILE\" & echo \$!" | |
| su -c "$CMD" $RUNAS > "$PIDFILE" | |
| echo 'Service started' >&2 | |
| } | |
| stop() { | |
| if [ ! -f "$PIDFILE" ] || ! kill -0 $(cat "$PIDFILE"); then | |
| echo 'Service not running' >&2 | |
| return 1 | |
| fi | |
| echo 'Stopping service…' >&2 | |
| kill -15 $(cat "$PIDFILE") && rm -f "$PIDFILE" | |
| echo 'Service stopped' >&2 | |
| } | |
| uninstall() { | |
| echo -n "Are you really sure you want to uninstall this service? That cannot be undone. [yes|No] " | |
| local SURE | |
| read SURE | |
| if [ "$SURE" = "yes" ]; then | |
| stop | |
| rm -f "$PIDFILE" | |
| echo "Notice: log file is not be removed: '$LOGFILE'" >&2 | |
| update-rc.d -f netrender-slave remove | |
| rm -fv "$0" | |
| fi | |
| } | |
| case "$1" in | |
| start) | |
| start | |
| ;; | |
| stop) | |
| stop | |
| ;; | |
| uninstall) | |
| uninstall | |
| ;; | |
| restart) | |
| stop | |
| start | |
| ;; | |
| *) | |
| echo "Usage: $0 {start|stop|restart|uninstall}" | |
| esac |