# HG changeset patch # User Robert McIntyre # Date 1340814050 18000 # Node ID 86d23b6d433fe33fcd6f54abae28be9f95d9059e # Parent 6c379ee3d46e96f10ca05b55a9a9167fb50cfb7e trying to fix AV sync issues. diff -r 6c379ee3d46e -r 86d23b6d433f clojure/com/aurellem/run/basic_choreo.clj --- a/clojure/com/aurellem/run/basic_choreo.clj Mon Jun 25 19:46:48 2012 -0500 +++ b/clojure/com/aurellem/run/basic_choreo.clj Wed Jun 27 11:20:50 2012 -0500 @@ -69,10 +69,8 @@ (transfer-control image-program-start) (do-nothing 1800)))) - - (def basic-render-dir - (File. user-home "proj/vba-clojure/render/basic")) + (File. user-home "proj/vba-clojure/render/basic2")) (defn basic-steps [] (first (activate-media))) diff -r 6c379ee3d46e -r 86d23b6d433f clojure/com/aurellem/run/final_cut.clj --- a/clojure/com/aurellem/run/final_cut.clj Mon Jun 25 19:46:48 2012 -0500 +++ b/clojure/com/aurellem/run/final_cut.clj Wed Jun 27 11:20:50 2012 -0500 @@ -15,6 +15,14 @@ (def render-dir (File. user-home "proj/vba-clojure/render/test")) +(defn force-sync + "keep the entire movie to a certain fps" + [fps] + + + ) + + (defn render-files! ([^File target-dir initial-state moves] (let [ram-map-dir (File. target-dir "ram-map") @@ -24,32 +32,81 @@ _ (.mkdir ram-map-dir) _ (.mkdir frames-dir) wave-writer (WaveWriter. audio-file) - moves (vec moves)] + moves (vec moves) + desired-fps 60 + seconds-per-frame (/ 1.0 desired-fps) + + ] (set-state! initial-state) - (dorun - (map - (fn [index] - (run-moves @current-state (vector (moves index))) + ;; clear sound buffer + (sound-bytes) + (try + (dorun + (reduce + (fn [[total-audio-samples + total-video-samples] move] + (run-moves @current-state (vector move)) + (let [sound (sound-bytes) + total-audio-samples (+ total-audio-samples + (count sound)) + total-audio-time + (* + (/ total-audio-samples 4) + (/ 44100)) + + total-video-time (* total-video-samples + seconds-per-frame) - ;; record audio - (.process wave-writer (sound-bytes) - gb-sound-format) - - ;; write screenshot - (write-png! - @current-state - (File. frames-dir (format "%07d.png" index))) - - ;; write ram-image - (write-ram-image! - @current-state - (File. ram-map-dir (format "%07d.png" index)))) - (range (count moves)))) - (.cleanup wave-writer))) - ([initial-state moves] - (render-files! render-dir initial-state moves)) - ([moves] - (render-files! (root) moves))) + av-diff (- total-audio-time + total-video-time) + write-video! + (fn [index] + ;; write screenshot + + + (write-png! + @current-state + (File. frames-dir (format "%07d.png" index))) + + ;; write ram-image + (write-ram-image! + @current-state + (File. ram-map-dir (format "%07d.png" index))))] + ;;(println "audio-samples:" (count sound)) + + ;; record audio + (.process wave-writer sound gb-sound-format) + + ;; duplicate or drop frames depending on + ;; desired-fps + (if (> (Math/abs av-diff) (* 2 seconds-per-frame)) + (if (< 0 av-diff) + ;; audio has gone past video, duplicate video. + (do (println + "duplicating frame, av-diff is" av-diff) + (write-video! (+ 1 total-video-samples)) + (write-video! (+ 2 total-video-samples)) + [total-audio-samples + (+ 2 total-video-samples)]) + ;; video has gone past audio, drop frame. + (do (println + "dropping frame, av-diff is" av-diff) + [total-audio-samples + total-video-samples])) + ;; no frame dropping or duplication required. + (do ;;(println "all normal") + (write-video! (+ 1 total-video-samples)) + [total-audio-samples + (+ 1 total-video-samples)])))) + [0 0 0] moves)) + (finally + (do + (println "cleanup audio.") + (.cleanup wave-writer)))))) + ([initial-state moves] + (render-files! render-dir initial-state moves)) + ([moves] + (render-files! (root) moves))) (defn file-names [#^File dir] (mapv #(.getCanonicalPath %) (next (sort (file-seq dir))))) @@ -96,12 +153,16 @@ (defn final-cut! [^File render-dir] (let [movie (File. render-dir "final.ogg") + final-audio (File. render-dir "final.wav") final (File. render-dir "final")] (.delete movie) (clojure.java.shell/sh + "sox" (.getCanonicalPath (File. render-dir "audio.wav")) + (.getCanonicalPath final-audio)) + (clojure.java.shell/sh "ffmpeg" "-r" "60" ;; maybe 59.7 ???! "-i" (str (.getCanonicalPath final) "/" "%07d.bmp") - "-i" (.getCanonicalPath (File. render-dir "audio.wav")) + "-i" (.getCanonicalPath final-audio) "-b:a" "128k" "-b:v" "9000k" "-c:a" "libvorbis" diff -r 6c379ee3d46e -r 86d23b6d433f todo.org --- a/todo.org Mon Jun 25 19:46:48 2012 -0500 +++ b/todo.org Wed Jun 27 11:20:50 2012 -0500 @@ -1,12 +1,14 @@ -* vba-clojure [3/8] +* vba-clojure [3/10] - [X] create ram display - [ ] derpy hack - [X] sound recording - [ ] fix unnecessary pauses before take-over - [ ] sell two of the 0x00 items at once. + - [ ] walk out of elevator efficiently - [ ] design demo choreography - [ ] implement choreography - [X] clojure function to assemble final video + - [ ] fix A/V sync issues * fimfiction [0/1] - [ ] clojure catalogue