“The odd uneven time.“
This commit is contained in:
parent
08970dfa47
commit
3e18b28365
2 changed files with 60 additions and 46 deletions
29
README.org
29
README.org
|
@ -1,51 +1,52 @@
|
|||
|
||||
* time, space, stacking, slicing, scanning, etc
|
||||
|
||||
"Slitscan imaging techniques are used to create static images of time-based phenomena. In traditional film photography, slit scan images are created by exposing film as it slides past a slit-shaped aperture. In the digital realm, thin slices are extracted from a sequence of video frames, and concatenated into a new image."
|
||||
“Slitscan imaging techniques are used to create static images of time-based phenomena. In traditional film photography, slit scan images are created by exposing film as it slides past a slit-shaped aperture. In the digital realm, thin slices are extracted from a sequence of video frames, and concatenated into a new image.”
|
||||
|
||||
[[http://www.flong.com/texts/lists/slit_scan/][An Informal Catalogue of Slit-Scan Video Artworks and Research]] Compiled by Golan Levin.
|
||||
|
||||
[[slitscope_0.jpeg]]
|
||||
|
||||
This particular slitscan provides some slightly configurable scaffolding around ffmpeg (based on a blogpost from [[http://oioiiooixiii.blogspot.com/2017/11/ffmpeg-temporal-slice-stacking-effect.html][oioiiooixiii]]) and is intended for non-realtime rendering at various resolutions. it's neither first, nor last. it's not especially interesting, educational or efficient. just another cloudform in the endless space of possible implementation...
|
||||
This particular slitscan provides some slightly configurable scaffolding around ffmpeg (based on a blogpost from [[http://oioiiooixiii.blogspot.com/2017/11/ffmpeg-temporal-slice-stacking-effect.html][oioiiooixiii]]) and is intended for non-realtime rendering at various resolutions. it's neither first, nor last. it's not especially interesting, educational or efficient. just another cloudform in the endless space of possible implementation…
|
||||
|
||||
* installation, configuration, operation, etc
|
||||
|
||||
install (mac)...
|
||||
install (macOS)…
|
||||
#+BEGIN_SRC text
|
||||
brew install ffmpeg drracket
|
||||
git clone https://github.com/zzkt/slitscan.git
|
||||
#+END_SRC
|
||||
|
||||
install (debian/ubuntu)...
|
||||
install (debian/ubuntu)…
|
||||
#+BEGIN_SRC text
|
||||
sudo apt install ffmpeg racket
|
||||
git clone https://github.com/zzkt/slitscan.git
|
||||
#+END_SRC
|
||||
|
||||
simple transform...
|
||||
simple transform…
|
||||
#+BEGIN_SRC text
|
||||
racket slitscan.rkt -v -i <input.mp4>
|
||||
racket slitscan.rkt -v input.mp4
|
||||
#+END_SRC
|
||||
|
||||
transform at 1080p and delete working files, with minimal command line noise...
|
||||
transform at 1080p and delete working files, with minimal command line noise…
|
||||
#+BEGIN_SRC text
|
||||
racket slitscan.rkt --width 1920 --height 1080 --loglevel quiet --cleanup -i <input.mp4>
|
||||
racket slitscan.rkt --width 1920 --height 1080 --loglevel quiet --cleanup input.mp4
|
||||
#+END_SRC
|
||||
|
||||
options...
|
||||
options…
|
||||
#+BEGIN_SRC text
|
||||
slitscan [ <option> ... ]
|
||||
slitscan [ <option> ... ] <video-file>
|
||||
where <option> is one of
|
||||
-v, --verbose : various verbose messages
|
||||
-l <level>, --loglevel <level> : loglevel for ffmpeg e.g. quiet, error, warning, info, debug
|
||||
-c, --cleanup : Clean up temporary/working files
|
||||
-n, --noresize : do not resize the input file
|
||||
--horizontal : output a horizontal video only (default: both)
|
||||
--vertical : output a vertical video only (default: both)
|
||||
--width <pixels> : width of output output video
|
||||
--height <pixels> : height of output output video
|
||||
-i <video>, --input <video> : input file
|
||||
-f <folder>, --folder <folder> : input folder
|
||||
--width <pixels> : width of transform video
|
||||
--height <pixels> : height of tansform video
|
||||
-f <folder>, --in-folder <folder> : input folder
|
||||
-o <folder>, --out-folder <folder> : output folder
|
||||
--help, -h : Show this help
|
||||
#+END_SRC
|
||||
|
||||
|
|
77
slitscan.rkt
77
slitscan.rkt
|
@ -25,7 +25,7 @@
|
|||
;;;
|
||||
;;; Requirements
|
||||
;;;
|
||||
;;; Racket, ffmpeg and zsh or bash (probably)
|
||||
;;; Racket, ffmpeg and zsh or bash (and probably works with other shells)
|
||||
;;;
|
||||
;;; Commentary
|
||||
;;;
|
||||
|
@ -43,10 +43,12 @@
|
|||
|
||||
|
||||
;; cli options
|
||||
(define filename (make-parameter ""))
|
||||
(define verbose? (make-parameter #f))
|
||||
(define cleanup? (make-parameter #f))
|
||||
(define filename (make-parameter "untitled"))
|
||||
(define input-folder (make-parameter ""))
|
||||
(define noresize? (make-parameter #f))
|
||||
(define in-folder (make-parameter ""))
|
||||
(define out-folder (make-parameter ""))
|
||||
(define loglevel (make-parameter "")) ;; leave unset by default
|
||||
|
||||
;; output options horiz/vert/both
|
||||
|
@ -61,17 +63,21 @@
|
|||
(command-line
|
||||
#:program "slitscan"
|
||||
#:once-each
|
||||
(("-v" "--verbose") "various verbose messages" (verbose? #t))
|
||||
(("-l" "--loglevel") level "loglevel for ffmpeg e.g. quiet, error, warning, info, debug" (loglevel level))
|
||||
(("-c" "--cleanup") "Clean up temporary/working files" (cleanup? #t))
|
||||
(("--horizontal") "output a horizontal video only (default: both)" (hout-only? #t))
|
||||
(("--vertical") "output a vertical video only (default: both)" (vout-only? #t))
|
||||
(("--width") pixels "width of transform video" (output-width pixels))
|
||||
(("--height") pixels "height of tansform video" (output-height pixels))
|
||||
(("-i" "--input") video "input file" (filename video))
|
||||
(("-f" "--folder") folder "input folder" (input-folder folder))
|
||||
#:args () ; rest of the args?
|
||||
(printf "slitscanning: ~a\n" (filename))))
|
||||
(("-v" "--verbose") "various verbose messages" (verbose? #t))
|
||||
(("-l" "--loglevel") level "loglevel for ffmpeg e.g. quiet, error, warning, info, debug" (loglevel level))
|
||||
(("-c" "--cleanup") "Clean up temporary/working files" (cleanup? #t))
|
||||
(("-n" "--noresize") "do not resize the input file" (noresize? #t))
|
||||
(("--horizontal") "output a horizontal video only (default: both)" (hout-only? #t))
|
||||
(("--vertical") "output a vertical video only (default: both)" (vout-only? #t))
|
||||
(("--width") pixels "width of transform video" (output-width pixels))
|
||||
(("--height") pixels "height of tansform video" (output-height pixels))
|
||||
(("-f" "--in-folder") folder "input folder" (in-folder folder))
|
||||
(("-o" "--out-folder") folder "output folder" (out-folder folder))
|
||||
#:args (video-file) ; rest of the args?
|
||||
(filename video-file)
|
||||
(if (file-exists? (filename))
|
||||
(printf "slitscanning: ~a\n" (filename))
|
||||
(raise-user-error 'slitscan "File '~a' does not exist." (filename)))))
|
||||
|
||||
;; emulation of $(...) shell syntax
|
||||
(define-syntax zout
|
||||
|
@ -87,11 +93,11 @@
|
|||
((and (not (verbose?)) (string=? "" (loglevel))) (loglevel "error")))
|
||||
|
||||
;; variables/various
|
||||
(define folder (if (not (string=? "" (input-folder)))
|
||||
(input-folder)
|
||||
(define folder (if (not (string=? "" (in-folder)))
|
||||
(in-folder)
|
||||
(zout "mktemp -d")))
|
||||
|
||||
(vecho "using folder: ~a\n" folder)
|
||||
(vecho "using folder '~a' for input\n" folder)
|
||||
|
||||
;(define fffeature "ffprobe -v quiet -select_streams v -of default=noprint_wrappers=1:nokey=1 -show_entries stream=")
|
||||
|
||||
|
@ -99,10 +105,10 @@
|
|||
|
||||
;; assume most/all codecs/formats/streams have a duration
|
||||
(define duration (let ((f (string->number
|
||||
(zout (format
|
||||
"~aduration \"~a\""
|
||||
fffeature (filename))))))
|
||||
(if f f 0)))
|
||||
(zout (format
|
||||
"~aduration \"~a\""
|
||||
fffeature (filename))))))
|
||||
(if f f 0)))
|
||||
|
||||
(vecho "duration: ~a seconds\n" duration)
|
||||
|
||||
|
@ -117,10 +123,10 @@
|
|||
|
||||
;; number of frames. estimate for codecs/formats/streams without nb_frames
|
||||
(define frames (let ((f (string->number
|
||||
(zout (format
|
||||
"~anb_frames \"~a\""
|
||||
fffeature (filename))))))
|
||||
(if f f (ceiling (* duration fps)))))
|
||||
(zout (format
|
||||
"~anb_frames \"~a\""
|
||||
fffeature (filename))))))
|
||||
(if f f (ceiling (* duration fps)))))
|
||||
|
||||
(vecho "frames: ~a\n" frames)
|
||||
|
||||
|
@ -143,10 +149,11 @@
|
|||
;; rezise video
|
||||
(define resized-video (string-append folder "/resized.mkv"))
|
||||
|
||||
;; resize video, or copy file if 'noresize?' option is set
|
||||
(define (resize)
|
||||
(define ffmpeg-r1
|
||||
(format "ffmpeg -loglevel ~a -i \"~a\" -vf ~a -crf 10 \"~a\" 2>&1 | grep 'frame=' | tr \\n \\r; echo"
|
||||
(loglevel) (filename) scale resized-video))
|
||||
(loglevel) (filename) scale resized-video))
|
||||
(vecho "resizing video: ~a\n" resized-video)
|
||||
(system ffmpeg-r1))
|
||||
|
||||
|
@ -199,12 +206,12 @@
|
|||
(define ffmpeg-a1 ;; horizontal frame stack
|
||||
(format
|
||||
"ffmpeg -loglevel ~a -r ~a -i ~a/horz_frame%d.png \"~a_horizontal-smear.mkv\""
|
||||
(loglevel) fps folder (filename)))
|
||||
(loglevel) fps folder (filename)))
|
||||
|
||||
(define ffmpeg-a2 ;; vertical frame stack
|
||||
(format
|
||||
"ffmpeg -loglevel ~a -r ~a -i ~a/vert_frame%d.png \"~a_vertical-smear.mkv\""
|
||||
(loglevel) fps folder (filename)))
|
||||
(loglevel) fps folder (filename)))
|
||||
|
||||
;; assemble
|
||||
(cond ((hout-only?) (system ffmpeg-a1))
|
||||
|
@ -235,9 +242,15 @@
|
|||
|
||||
;; output in 3 (or 4 (or 5)) steps
|
||||
|
||||
(when (resize) (printf "resized\n"))
|
||||
(when (slice) (printf "slicwd\n"))
|
||||
(when (assemble) (printf "assembled\n"))
|
||||
(when (cleanup) (printf "done\n"))
|
||||
(define (slitscan)
|
||||
(when (resize) (printf "resized\n"))
|
||||
(when (slice) (printf "sliced\n"))
|
||||
(when (assemble) (printf "assembled\n"))
|
||||
(when (cleanup) (printf "done\n")))
|
||||
|
||||
|
||||
;; (printf "The file '~a' does not exist.\n" (filename))
|
||||
|
||||
(slitscan)
|
||||
|
||||
;;; FIN
|
||||
|
|
Loading…
Reference in a new issue