Class: Ffmprb::Process

Inherits:
Object
  • Object
show all
Defined in:
lib/ffmprb/process.rb,
lib/ffmprb/process/input.rb,
lib/ffmprb/process/output.rb

Defined Under Namespace

Classes: Input, Output

Class Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

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_hiObject

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_loObject

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_secObject

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_secObject

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, a_overlay_i, silence, av_main_o, video: {resolution: Ffmprb::QVGA, fps: 30})
  Ffmprb.process(av_main_i, a_overlay_i, silence, av_main_o) do |main_input, overlay_input, duck_data, main_output|

    in_main = input(main_input, **(video ? {} : {only: :audio}))
    in_over = input(overlay_input, only: :audio)
    output(main_output, **(video ? {resolution: video[:resolution], fps: video[:fps]} : {})) do
      roll in_main
      ducked_overlay_volume = {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

        ducked_overlay_volume.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
        ducked_overlay_volume.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
      overlay in_over.volume ducked_overlay_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

Raises:



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

#runObject



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