diff --git a/CHANGELOG.md b/CHANGELOG.md index fdba0b9a4..53aa270fb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,8 @@ # Javis.jl - Changelog +## Unreleased +- `frames` keyword for `render` for faster rendering + ## v0.5.2 - Added support for local network live streaming diff --git a/src/Javis.jl b/src/Javis.jl index d95cf82f5..41016d84e 100644 --- a/src/Javis.jl +++ b/src/Javis.jl @@ -189,6 +189,8 @@ Streaming to Twitch or other platforms are not yet supported. - `ffmpeg_loglevel::String`: - Can be used if there are errors with ffmpeg. Defaults to panic: All other options are described here: https://ffmpeg.org/ffmpeg.html +- `frames`: Only render these frames for faster rendering + - **Default:** All frames get rendered """ function render( video::Video; @@ -198,9 +200,14 @@ function render( streamconfig::Union{StreamConfig,Nothing} = nothing, tempdirectory = "", ffmpeg_loglevel = "panic", + frames = nothing, ) objects = video.objects + render_frames = frames frames = preprocess_frames!(objects) + if render_frames === nothing + render_frames = frames + end if liveview if isdefined(Main, :IJulia) && Main.IJulia.inited @@ -231,12 +238,17 @@ function render( filecounter = 1 @showprogress 1 "Rendering frames..." for frame in frames - frame_image = convert.(RGB, get_javis_frame(video, objects, frame)) - if !isempty(tempdirectory) + frame > last(render_frames) && break + if frame in render_frames + frame_image = convert.(RGB, get_javis_frame(video, objects, frame)) + else + compute_javis_frame(video, objects, frame) + end + if !isempty(tempdirectory) && frame in render_frames Images.save("$(tempdirectory)/$(lpad(filecounter, 10, "0")).png", frame_image) end - if render_mp4 - if frame == first(frames) + if render_mp4 && frame in render_frames + if frame == first(render_frames) video_encoder = prepareencoder( frame_image, framerate = framerate, @@ -245,7 +257,9 @@ function render( end appendencode!(video_encoder, video_io, frame_image, filecounter) end - filecounter += 1 + if frame in render_frames + filecounter += 1 + end end isempty(pathname) && return @@ -296,6 +310,13 @@ be applied to. - `Array{ARGB32, 2}` - request frame as a matrix """ function get_javis_frame(video, objects, frame) + compute_javis_frame(video, objects, frame) + img = image_as_matrix() + finish() + return img +end + +function compute_javis_frame(video, objects, frame) background_settings = ObjectSetting() Drawing(video.width, video.height, :image) origin() @@ -323,9 +344,6 @@ function get_javis_frame(video, objects, frame) # if object is in global layer this changes the background settings update_background_settings!(background_settings, object) end - img = image_as_matrix() - finish() - return img end """