Class: Ffmprb::Process
- Inherits:
-
Object
- Object
- Ffmprb::Process
- Defined in:
- lib/ffmprb/process.rb,
lib/ffmprb/process/input.rb,
lib/ffmprb/process/output.rb
Defined Under Namespace
Class Attribute Summary collapse
-
.duck_audio_hi ⇒ Object
Returns the value of attribute duck_audio_hi.
-
.duck_audio_lo ⇒ Object
Returns the value of attribute duck_audio_lo.
-
.duck_audio_silent_min_sec ⇒ Object
Returns the value of attribute duck_audio_silent_min_sec.
-
.duck_audio_transition_sec ⇒ Object
Returns the value of attribute duck_audio_transition_sec.
Class Method Summary collapse
- .duck_audio(av_main_i, a_overlay_i, silence, av_main_o, video: {resolution: Ffmprb::QVGA, fps: 30}) ⇒ Object
- .intermediate_channel_extname(*media) ⇒ Object
Instance Method Summary collapse
- #[](obj) ⇒ Object
-
#initialize(*args, &blk) ⇒ Process
constructor
A new instance of Process.
- #input(io, only: nil) ⇒ Object
- #output(io, only: nil, resolution: Ffmprb::QVGA, fps: 30, &blk) ⇒ Object
- #run ⇒ Object
-
#threaded(thr) ⇒ Object
TODO deserves a better solution.
Constructor Details
#initialize(*args, &blk) ⇒ Process
Returns a new instance of Process.
54 55 56 |
# File 'lib/ffmprb/process.rb', line 54 def initialize(*args, &blk) @inputs = [] end |
Class Attribute Details
.duck_audio_hi ⇒ Object
Returns the value of attribute duck_audio_hi.
10 11 12 |
# File 'lib/ffmprb/process.rb', line 10 def duck_audio_hi @duck_audio_hi end |
.duck_audio_lo ⇒ Object
Returns the value of attribute duck_audio_lo.
10 11 12 |
# File 'lib/ffmprb/process.rb', line 10 def duck_audio_lo @duck_audio_lo end |
.duck_audio_silent_min_sec ⇒ Object
Returns the value of attribute duck_audio_silent_min_sec.
11 12 13 |
# File 'lib/ffmprb/process.rb', line 11 def duck_audio_silent_min_sec @duck_audio_silent_min_sec end |
.duck_audio_transition_sec ⇒ Object
Returns the value of attribute duck_audio_transition_sec.
11 12 13 |
# File 'lib/ffmprb/process.rb', line 11 def duck_audio_transition_sec @duck_audio_transition_sec end |
Class Method Details
.duck_audio(av_main_i, a_overlay_i, silence, av_main_o, video: {resolution: Ffmprb::QVGA, fps: 30}) ⇒ Object
25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
# File 'lib/ffmprb/process.rb', line 25 def duck_audio(av_main_i, , silence, av_main_o, video: {resolution: Ffmprb::QVGA, fps: 30}) Ffmprb.process(av_main_i, , silence, av_main_o) do |main_input, , duck_data, main_output| in_main = input(main_input, **(video ? {} : {only: :audio})) in_over = input(, only: :audio) output(main_output, **(video ? {resolution: video[:resolution], fps: video[:fps]} : {})) do roll in_main = {0.0 => Process.duck_audio_lo} duck_data.each do |silent| next if silent.end_at && silent.start_at && (silent.end_at - silent.start_at) < Process.duck_audio_silent_min_sec .merge!( [silent.start_at - Process.duck_audio_transition_sec/2, 0.0].max => Process.duck_audio_lo, (silent.start_at + Process.duck_audio_transition_sec/2) => Process.duck_audio_hi ) if silent.start_at .merge!( [silent.end_at - Process.duck_audio_transition_sec/2, 0.0].max => Process.duck_audio_hi, (silent.end_at + Process.duck_audio_transition_sec/2) => Process.duck_audio_lo ) if silent.end_at end in_over.volume Ffmprb.logger.debug "Ducking audio with volumes: {#{ducked_overlay_volume.map{|t,v| "#{t}: #{v}"}.join ', '}}" end end end |
.intermediate_channel_extname(*media) ⇒ Object
13 14 15 16 17 18 19 20 21 22 23 |
# File 'lib/ffmprb/process.rb', line 13 def intermediate_channel_extname(*media) if media == [:video] '.y4m' elsif media == [:audio] '.wav' elsif media.sort == [:audio, :video] '.flv' else raise Error, "I don't know how to channel [#{media.join ', '}]" end end |
Instance Method Details
#[](obj) ⇒ Object
77 78 79 80 81 82 |
# File 'lib/ffmprb/process.rb', line 77 def [](obj) case obj when Input @inputs.find_index(obj) end end |
#input(io, only: nil) ⇒ Object
58 59 60 61 62 |
# File 'lib/ffmprb/process.rb', line 58 def input(io, only: nil) Input.new(io, only: only).tap do |inp| @inputs << inp end end |
#output(io, only: nil, resolution: Ffmprb::QVGA, fps: 30, &blk) ⇒ Object
64 65 66 67 68 69 70 |
# File 'lib/ffmprb/process.rb', line 64 def output(io, only: nil, resolution: Ffmprb::QVGA, fps: 30, &blk) raise Error, "Just one output for now, sorry." if @output @output = Output.new(io, only: only, resolution: resolution).tap do |out| out.instance_exec &blk end end |
#run ⇒ Object
72 73 74 75 |
# File 'lib/ffmprb/process.rb', line 72 def run Util.ffmpeg command @threaded.to_a.each &:join end |
#threaded(thr) ⇒ Object
TODO deserves a better solution
85 86 87 |
# File 'lib/ffmprb/process.rb', line 85 def threaded(thr) (@threaded ||= []) << thr end |