Module: Ffmprb::Filter
- Defined in:
- lib/ffmprb/filter.rb
Defined Under Namespace
Classes: Error
Class Attribute Summary collapse
-
.silence_noise_max_db ⇒ Object
Returns the value of attribute silence_noise_max_db.
Class Method Summary collapse
- .afade_in(duration, input = nil, output = nil) ⇒ Object
- .afade_out(duration, input = nil, output = nil) ⇒ Object
- .alphamerge(inputs, output = nil) ⇒ Object
- .amix_to_first_same_volume(inputs, output = nil) ⇒ Object
- .anull(input = nil, output = nil) ⇒ Object
- .anullsink(input = nil) ⇒ Object
- .areverse(input = nil, output = nil) ⇒ Object
- .asplit(inputs = nil, outputs = nil) ⇒ Object
- .atempo(tempo, input = nil, output = nil) ⇒ Object
- .atrim(st, en = nil, input = nil, output = nil) ⇒ Object
- .blank_source(duration, resolution, fps, output = nil) ⇒ Object
- .blend_a(duration, inputs, output = nil) ⇒ Object
- .blend_v(duration, resolution, fps, inputs, output = nil) ⇒ Object
- .color_source(color, duration, resolution, fps, output = nil) ⇒ Object
- .complex_args(*filters) ⇒ Object
- .concat_a(inputs, output = nil) ⇒ Object
- .concat_av(inputs, output = nil) ⇒ Object
- .concat_v(inputs, output = nil) ⇒ Object
- .copy(input = nil, output = nil) ⇒ Object
-
.crop(crop, input = nil, output = nil) ⇒ Object
TODO unused at the moment.
- .crop_prop(crop, input = nil, output = nil) ⇒ Object
- .crop_prop_exps(crop) ⇒ Object
- .fade_out_alpha(duration, input = nil, output = nil) ⇒ Object
- .fps(fps, input = nil, output = nil) ⇒ Object
- .interpolate_v(fps, input = nil, output = nil) ⇒ Object
-
.nullsink(input = nil) ⇒ Object
NOTE might be very useful with UGC: def cropdetect.
- .overlay(x = 0, y = 0, inputs = nil, output = nil) ⇒ Object
- .pad(resolution, input = nil, output = nil) ⇒ Object
- .pp(input = nil, output = nil) ⇒ Object
- .reverse(input = nil, output = nil) ⇒ Object
- .scale(resolution, input = nil, output = nil) ⇒ Object
- .scale_pad(resolution, input = nil, output = nil) ⇒ Object
- .scale_pad_fps(resolution, _fps, input = nil, output = nil) ⇒ Object
- .setpts(ratio, input = nil, output = nil) ⇒ Object
- .setsar(ratio, input = nil, output = nil) ⇒ Object
- .silencedetect(input = nil, output = nil) ⇒ Object
- .silent_source(duration, output = nil) ⇒ Object
-
.split(inputs = nil, outputs = nil) ⇒ Object
NOTE might be very useful with transitions: def smartblur.
- .trim(st, en = nil, input = nil, output = nil) ⇒ Object
- .volume(volume, input = nil, output = nil) ⇒ Object
-
.volume_exp(volume) ⇒ Object
NOTE supposedly volume list is sorted.
- .white_source(duration, resolution, fps, output = nil) ⇒ Object
Class Attribute Details
.silence_noise_max_db ⇒ Object
Returns the value of attribute silence_noise_max_db.
9 10 11 |
# File 'lib/ffmprb/filter.rb', line 9 def silence_noise_max_db @silence_noise_max_db end |
Class Method Details
.afade_in(duration, input = nil, output = nil) ⇒ Object
15 16 17 |
# File 'lib/ffmprb/filter.rb', line 15 def afade_in(duration, input=nil, output=nil) inout 'afade=in:d=%{duration}:curve=hsin', input, output, duration: duration end |
.afade_out(duration, input = nil, output = nil) ⇒ Object
19 20 21 |
# File 'lib/ffmprb/filter.rb', line 19 def afade_out(duration, input=nil, output=nil) inout 'afade=out:d=%{duration}:curve=hsin', input, output, duration: duration end |
.alphamerge(inputs, output = nil) ⇒ Object
11 12 13 |
# File 'lib/ffmprb/filter.rb', line 11 def alphamerge(inputs, output=nil) inout 'alphamerge', inputs, output end |
.amix_to_first_same_volume(inputs, output = nil) ⇒ Object
23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
# File 'lib/ffmprb/filter.rb', line 23 def amix_to_first_same_volume(inputs, output=nil) filters = [] new_inputs = inputs.map do |input| if input == inputs.first input else "apd#{input}".tap do |lbl_aux| filters += inout("apad", input, lbl_aux) # NOTE we'll see if we really need this filter separate end end end filters + inout('amix=%{inputs_count}:duration=shortest:dropout_transition=0, volume=%{inputs_count}', new_inputs, output, inputs_count: (inputs.empty?? nil : inputs.size)) end |
.anull(input = nil, output = nil) ⇒ Object
40 41 42 |
# File 'lib/ffmprb/filter.rb', line 40 def anull(input=nil, output=nil) inout 'anull', input, output end |
.anullsink(input = nil) ⇒ Object
44 45 46 |
# File 'lib/ffmprb/filter.rb', line 44 def anullsink(input=nil) inout 'anullsink', input, nil end |
.areverse(input = nil, output = nil) ⇒ Object
52 53 54 |
# File 'lib/ffmprb/filter.rb', line 52 def areverse(input=nil, output=nil) inout 'areverse', input, output end |
.asplit(inputs = nil, outputs = nil) ⇒ Object
48 49 50 |
# File 'lib/ffmprb/filter.rb', line 48 def asplit(inputs=nil, outputs=nil) inout 'asplit', inputs, outputs end |
.atempo(tempo, input = nil, output = nil) ⇒ Object
56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 |
# File 'lib/ffmprb/filter.rb', line 56 def atempo(tempo, input=nil, output=nil) fail Error, "Push the tempo!" unless tempo > 0 fil = '' tmp = tempo while tmp > 2.0 fil += 'atempo=2.0, ' tmp /= 2.0 end while tmp < 0.5 fil += 'atempo=0.5, ' tmp /= 0.5 end inout "#{fil}atempo=#{tmp.to_f}", input, output end |
.atrim(st, en = nil, input = nil, output = nil) ⇒ Object
73 74 75 76 |
# File 'lib/ffmprb/filter.rb', line 73 def atrim(st, en=nil, input=nil, output=nil) inout 'atrim=%{start_end}, asetpts=PTS-STARTPTS', input, output, start_end: [st, en].compact.join(':') end |
.blank_source(duration, resolution, fps, output = nil) ⇒ Object
78 79 80 |
# File 'lib/ffmprb/filter.rb', line 78 def blank_source(duration, resolution, fps, output=nil) color_source '0x000000@0', duration, resolution, fps, output end |
.blend_a(duration, inputs, output = nil) ⇒ Object
82 83 84 85 86 87 88 89 90 91 92 |
# File 'lib/ffmprb/filter.rb', line 82 def blend_a(duration, inputs, output=nil) fail Error, "must be given 2 inputs" unless inputs.size == 2 aux_lbl = "blnd#{inputs[0]}" auxx_lbl = "x#{aux_lbl}" [ *afade_out(duration, inputs[0], aux_lbl), *afade_in(duration, inputs[1], auxx_lbl), *amix_to_first_same_volume([auxx_lbl, aux_lbl], output) ] end |
.blend_v(duration, resolution, fps, inputs, output = nil) ⇒ Object
94 95 96 97 98 99 100 101 102 103 104 105 106 107 |
# File 'lib/ffmprb/filter.rb', line 94 def blend_v(duration, resolution, fps, inputs, output=nil) fail Error, "must be given 2 inputs" unless inputs.size == 2 aux_lbl = "blnd#{inputs[0]}" auxx_lbl = "x#{aux_lbl}" [ *white_source(duration, resolution, fps, aux_lbl), *inout([ *alphamerge([inputs[0], aux_lbl]), *fade_out_alpha(duration) ].join(', '), nil, auxx_lbl), *(0, 0, [inputs[1], auxx_lbl], output), ] end |
.color_source(color, duration, resolution, fps, output = nil) ⇒ Object
109 110 111 112 |
# File 'lib/ffmprb/filter.rb', line 109 def color_source(color, duration, resolution, fps, output=nil) inout 'color=%{color}:d=%{duration}:s=%{resolution}:r=%{fps}', nil, output, color: color, duration: duration, resolution: resolution, fps: fps end |
.complex_args(*filters) ⇒ Object
303 304 305 306 307 308 |
# File 'lib/ffmprb/filter.rb', line 303 def complex_args(*filters) [].tap do |args| args << '-filter_complex' << filters.join('; ') unless filters.empty? end end |
.concat_a(inputs, output = nil) ⇒ Object
119 120 121 122 |
# File 'lib/ffmprb/filter.rb', line 119 def concat_a(inputs, output=nil) return anull(inputs, output) if inputs.size == 1 inout 'concat=%{count}:v=0:a=1', inputs, output, count: inputs.size end |
.concat_av(inputs, output = nil) ⇒ Object
124 125 126 127 |
# File 'lib/ffmprb/filter.rb', line 124 def concat_av(inputs, output=nil) fail Error, "must be given an even number of inputs" unless inputs.size.even? inout 'concat=%{count}:v=1:a=1', inputs, output, count: inputs.size/2 end |
.concat_v(inputs, output = nil) ⇒ Object
114 115 116 117 |
# File 'lib/ffmprb/filter.rb', line 114 def concat_v(inputs, output=nil) return copy(inputs, output) if inputs.size == 1 inout 'concat=%{count}:v=1:a=0', inputs, output, count: inputs.size end |
.copy(input = nil, output = nil) ⇒ Object
129 130 131 |
# File 'lib/ffmprb/filter.rb', line 129 def copy(input=nil, output=nil) inout 'copy', input, output end |
.crop(crop, input = nil, output = nil) ⇒ Object
TODO unused at the moment
134 135 136 |
# File 'lib/ffmprb/filter.rb', line 134 def crop(crop, input=nil, output=nil) inout 'crop=x=%{left}:y=%{top}:w=%{width}:h=%{height}', input, output, crop end |
.crop_prop(crop, input = nil, output = nil) ⇒ Object
138 139 140 141 |
# File 'lib/ffmprb/filter.rb', line 138 def crop_prop(crop, input=nil, output=nil) inout 'crop=%{crop_exp}', input, output, crop_exp: crop_prop_exps(crop).join(':') end |
.crop_prop_exps(crop) ⇒ Object
143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 |
# File 'lib/ffmprb/filter.rb', line 143 def crop_prop_exps(crop) exps = [] if crop[:left] exps << "x=in_w*#{crop[:left]}" end if crop[:top] exps << "y=in_h*#{crop[:top]}" end if crop[:right] && crop[:left] fail Error, "Must specify two of {left, right, width} at most" if crop[:width] crop[:width] = 1 - crop[:right] - crop[:left] elsif crop[:width] if !crop[:left] && crop[:right] crop[:left] = 1 - crop[:width] - crop[:right] exps << "x=in_w*#{crop[:left]}" end end exps << "w=in_w*#{crop[:width]}" if crop[:bottom] && crop[:top] fail Error, "Must specify two of {top, bottom, height} at most" if crop[:height] crop[:height] = 1 - crop[:bottom] - crop[:top] elsif crop[:height] if !crop[:top] && crop[:bottom] crop[:top] = 1 - crop[:height] - crop[:bottom] exps << "y=in_h*#{crop[:top]}" end end exps << "h=in_h*#{crop[:height]}" exps end |
.fade_out_alpha(duration, input = nil, output = nil) ⇒ Object
179 180 181 |
# File 'lib/ffmprb/filter.rb', line 179 def fade_out_alpha(duration, input=nil, output=nil) inout 'fade=out:d=%{duration}:alpha=1', input, output, duration: duration end |
.fps(fps, input = nil, output = nil) ⇒ Object
183 184 185 |
# File 'lib/ffmprb/filter.rb', line 183 def fps(fps, input=nil, output=nil) inout 'fps=fps=%{fps}', input, output, fps: fps end |
.interpolate_v(fps, input = nil, output = nil) ⇒ Object
187 188 189 |
# File 'lib/ffmprb/filter.rb', line 187 def interpolate_v(fps, input=nil, output=nil) inout 'framerate=fps=%{fps}', input, output, fps: fps end |
.nullsink(input = nil) ⇒ Object
NOTE might be very useful with UGC: def cropdetect
194 195 196 |
# File 'lib/ffmprb/filter.rb', line 194 def nullsink(input=nil) inout 'nullsink', input, nil end |
.overlay(x = 0, y = 0, inputs = nil, output = nil) ⇒ Object
198 199 200 |
# File 'lib/ffmprb/filter.rb', line 198 def (x=0, y=0, inputs=nil, output=nil) inout 'overlay=x=%{x}:y=%{y}:eof_action=pass', inputs, output, x: x, y: y end |
.pad(resolution, input = nil, output = nil) ⇒ Object
202 203 204 205 206 207 208 209 |
# File 'lib/ffmprb/filter.rb', line 202 def pad(resolution, input=nil, output=nil) width, height = resolution.to_s.split('x') inout [ inout('pad=%{width}:%{height}:(%{width}-iw*min(%{width}/iw\\,%{height}/ih))/2:(%{height}-ih*min(%{width}/iw\\,%{height}/ih))/2', width: width, height: height), *setsar(1) # NOTE the scale & pad formulae damage SAR a little, unfortunately ].join(', '), input, output end |
.pp(input = nil, output = nil) ⇒ Object
211 212 213 |
# File 'lib/ffmprb/filter.rb', line 211 def pp(input=nil, output=nil) inout 'pp=hb/vb/dr/al', input, output end |
.reverse(input = nil, output = nil) ⇒ Object
215 216 217 |
# File 'lib/ffmprb/filter.rb', line 215 def reverse(input=nil, output=nil) inout 'reverse', input, output end |
.scale(resolution, input = nil, output = nil) ⇒ Object
227 228 229 230 231 232 233 |
# File 'lib/ffmprb/filter.rb', line 227 def scale(resolution, input=nil, output=nil) width, height = resolution.to_s.split('x') inout [ inout('scale=iw*min(%{width}/iw\\,%{height}/ih):ih*min(%{width}/iw\\,%{height}/ih)', width: width, height: height), *setsar(1) # NOTE the scale & pad formulae damage SAR a little, unfortunately ].join(', '), input, output end |
.scale_pad(resolution, input = nil, output = nil) ⇒ Object
235 236 237 238 239 240 |
# File 'lib/ffmprb/filter.rb', line 235 def scale_pad(resolution, input=nil, output=nil) inout [ *scale(resolution), *pad(resolution) ].join(', '), input, output end |
.scale_pad_fps(resolution, _fps, input = nil, output = nil) ⇒ Object
242 243 244 245 246 247 |
# File 'lib/ffmprb/filter.rb', line 242 def scale_pad_fps(resolution, _fps, input=nil, output=nil) inout [ *scale_pad(resolution), *fps(_fps) ].join(', '), input, output end |
.setpts(ratio, input = nil, output = nil) ⇒ Object
223 224 225 |
# File 'lib/ffmprb/filter.rb', line 223 def setpts(ratio, input=nil, output=nil) inout 'setpts=%{r_fps}*PTS', input, output, r_fps: 1.0/ratio end |
.setsar(ratio, input = nil, output = nil) ⇒ Object
219 220 221 |
# File 'lib/ffmprb/filter.rb', line 219 def setsar(ratio, input=nil, output=nil) inout 'setsar=%{ratio}', input, output, ratio: ratio end |
.silencedetect(input = nil, output = nil) ⇒ Object
249 250 251 252 |
# File 'lib/ffmprb/filter.rb', line 249 def silencedetect(input=nil, output=nil) inout 'silencedetect=d=1:n=%{silence_noise_max_db}dB', input, output, silence_noise_max_db: silence_noise_max_db end |
.silent_source(duration, output = nil) ⇒ Object
254 255 256 |
# File 'lib/ffmprb/filter.rb', line 254 def silent_source(duration, output=nil) inout 'aevalsrc=0:d=%{duration}', nil, output, duration: duration end |
.split(inputs = nil, outputs = nil) ⇒ Object
NOTE might be very useful with transitions: def smartblur
260 261 262 |
# File 'lib/ffmprb/filter.rb', line 260 def split(inputs=nil, outputs=nil) inout 'split', inputs, outputs end |
.trim(st, en = nil, input = nil, output = nil) ⇒ Object
264 265 266 267 |
# File 'lib/ffmprb/filter.rb', line 264 def trim(st, en=nil, input=nil, output=nil) inout 'trim=%{start_end}, setpts=PTS-STARTPTS', input, output, start_end: [st, en].compact.join(':') end |
.volume(volume, input = nil, output = nil) ⇒ Object
269 270 271 272 |
# File 'lib/ffmprb/filter.rb', line 269 def volume(volume, input=nil, output=nil) inout "volume='%{volume_exp}':eval=frame", input, output, volume_exp: volume_exp(volume) end |
.volume_exp(volume) ⇒ Object
NOTE supposedly volume list is sorted
275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 |
# File 'lib/ffmprb/filter.rb', line 275 def volume_exp(volume) return volume unless volume.is_a?(Hash) fail Error, "volume cannot be empty" if volume.empty? prev_at = 0.0 prev_vol = volume[prev_at] || 1.0 exp = "#{volume[volume.keys.last]}" volume.each do |at, vol| next if at == 0.0 vol_exp = if (vol - prev_vol).abs < 0.001 vol else "(#{vol - prev_vol}*t + #{prev_vol*at - vol*prev_at})/#{at - prev_at}" end exp = "if(between(t, #{prev_at}, #{at}), #{vol_exp}, #{exp})" prev_at = at prev_vol = vol end exp end |
.white_source(duration, resolution, fps, output = nil) ⇒ Object
298 299 300 |
# File 'lib/ffmprb/filter.rb', line 298 def white_source(duration, resolution, fps, output=nil) color_source '0xFFFFFF@1', duration, resolution, fps, output end |