ffmprb 0.9.0 → 0.9.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/defaults.rb +3 -3
- data/lib/ffmprb/file.rb +1 -1
- data/lib/ffmprb/process/output.rb +20 -12
- data/lib/ffmprb/process.rb +11 -5
- data/lib/ffmprb/version.rb +1 -1
- data/lib/ffmprb.rb +2 -2
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 18d2b33a88ea0bfef44157b50426e7a5fbd587e2
|
4
|
+
data.tar.gz: 38db083fd7d0b4c33f23516c10efaff35cc922ad
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 02a1c4faeaddf87e9e24ff957c812adae99d10988224445904b37435a96a184177e00ec70042227e6c68316b80a999a1c4672671036179eb42bcc2a005299c8e
|
7
|
+
data.tar.gz: 57f3a51c4604a7d9136ce25283d9794a6aa95ad893452ed3b0550184df1002e9ceed23e9b043b216bbe16e0bc1d6b62b2b9f99a3415da90fe924c1e665559bf6
|
data/lib/defaults.rb
CHANGED
@@ -8,7 +8,7 @@ module Ffmprb
|
|
8
8
|
Process.duck_audio_transition_out_start = -0.6
|
9
9
|
Process.duck_audio_volume_hi = 0.9
|
10
10
|
Process.duck_audio_volume_lo = 0.1
|
11
|
-
Process.timeout =
|
11
|
+
Process.timeout = 30
|
12
12
|
|
13
13
|
Process.output_video_resolution = CGA
|
14
14
|
Process.output_video_fps = 30
|
@@ -16,12 +16,12 @@ module Ffmprb
|
|
16
16
|
|
17
17
|
Util.ffmpeg_cmd = %w[ffmpeg -y]
|
18
18
|
Util.ffprobe_cmd = ['ffprobe']
|
19
|
-
Util.cmd_timeout =
|
19
|
+
Util.cmd_timeout = 30
|
20
20
|
|
21
21
|
Util::ThreadedIoBuffer.blocks_max = 1024
|
22
22
|
Util::ThreadedIoBuffer.block_size = 64*1024
|
23
23
|
Util::ThreadedIoBuffer.timeout = 9
|
24
24
|
|
25
|
-
Util::Thread.timeout =
|
25
|
+
Util::Thread.timeout = 15
|
26
26
|
|
27
27
|
end
|
data/lib/ffmprb/file.rb
CHANGED
@@ -17,10 +17,11 @@ module Ffmprb
|
|
17
17
|
|
18
18
|
end
|
19
19
|
|
20
|
-
|
21
|
-
|
20
|
+
attr_reader :process
|
21
|
+
|
22
|
+
def initialize(io, process, video:, audio:)
|
22
23
|
@io = resolve(io)
|
23
|
-
@
|
24
|
+
@process = process
|
24
25
|
@channels = {
|
25
26
|
video: video && @io.channel?(:video) && OpenStruct.new(video),
|
26
27
|
audio: audio && @io.channel?(:audio) && OpenStruct.new(audio)
|
@@ -39,6 +40,8 @@ module Ffmprb
|
|
39
40
|
fail Error, "Supporting just full_screen for now, sorry." unless @reels.all?(&:full_screen?)
|
40
41
|
return @filters if @filters
|
41
42
|
|
43
|
+
idx = process.output_index(self)
|
44
|
+
|
42
45
|
@filters = []
|
43
46
|
|
44
47
|
# Concatting
|
@@ -52,7 +55,7 @@ module Ffmprb
|
|
52
55
|
|
53
56
|
# NOTE mapping input to this lbl
|
54
57
|
|
55
|
-
lbl = "o#{
|
58
|
+
lbl = "o#{idx}rl#{i}"
|
56
59
|
|
57
60
|
# NOTE Image-Padding to match the target resolution
|
58
61
|
# TODO full screen only at the moment (see exception above)
|
@@ -130,11 +133,11 @@ module Ffmprb
|
|
130
133
|
|
131
134
|
# NOTE snip the end of the previous segment and combine with this reel
|
132
135
|
|
133
|
-
lbl_end1 = "o#{
|
134
|
-
lbl_reel = "o#{
|
136
|
+
lbl_end1 = "o#{idx}tm#{i}b"
|
137
|
+
lbl_reel = "o#{idx}tn#{i}"
|
135
138
|
|
136
139
|
if !lbl # no reel
|
137
|
-
lbl_aux = "o#{
|
140
|
+
lbl_aux = "o#{idx}bk#{i}"
|
138
141
|
@filters.concat(
|
139
142
|
Filter.blank_source transition_length, channel(:video).resolution, channel(:video).fps, "#{lbl_aux}:v"
|
140
143
|
) if channel?(:video)
|
@@ -168,7 +171,7 @@ module Ffmprb
|
|
168
171
|
|
169
172
|
segments.compact!
|
170
173
|
|
171
|
-
lbl_out = "o#{
|
174
|
+
lbl_out = "o#{idx}o"
|
172
175
|
|
173
176
|
@filters.concat(
|
174
177
|
Filter.concat_v segments.map{|s| "#{s}:v"}, "#{lbl_out}:v"
|
@@ -188,9 +191,9 @@ module Ffmprb
|
|
188
191
|
|
189
192
|
# Audio overlaying
|
190
193
|
|
191
|
-
lbl_nxt = "o#{
|
194
|
+
lbl_nxt = "o#{idx}o#{i}"
|
192
195
|
|
193
|
-
lbl_over = "o#{
|
196
|
+
lbl_over = "o#{idx}l#{i}"
|
194
197
|
@filters.concat( # NOTE audio only, see above
|
195
198
|
over_reel.reel.filters_for lbl_over, video: false, audio: channel(:audio)
|
196
199
|
)
|
@@ -235,7 +238,7 @@ module Ffmprb
|
|
235
238
|
Ffmprb.logger.debug "Re-routed the main audio output (#{main_av_inter_o.path}->...->#{main_av_o.path}) through the process of audio ducking"
|
236
239
|
|
237
240
|
over_a_i, over_a_o = File.threaded_buffered_fifo(Process.intermediate_channel_extname :audio)
|
238
|
-
lbl_over = "o#{
|
241
|
+
lbl_over = "o#{idx}l#{i}"
|
239
242
|
@filters.concat(
|
240
243
|
over_reel.reel.filters_for lbl_over, video: false, audio: channel(:audio)
|
241
244
|
)
|
@@ -245,12 +248,17 @@ module Ffmprb
|
|
245
248
|
inter_i, inter_o = File.threaded_buffered_fifo(main_av_inter_o.extname)
|
246
249
|
Ffmprb.logger.debug "Allocated fifos to buffer media (#{inter_i.path}>#{inter_o.path}) while finding silence"
|
247
250
|
|
251
|
+
ignore_broken_pipe_was = process.ignore_broken_pipe
|
252
|
+
process.ignore_broken_pipe = true # NOTE audio ducking process may break the overlay pipe
|
253
|
+
|
248
254
|
Util::Thread.new "audio ducking" do
|
249
255
|
silence = Ffmprb.find_silence(main_av_inter_o, inter_i)
|
250
256
|
|
251
257
|
Ffmprb.logger.debug "Audio ducking with silence: [#{silence.map{|s| "#{s.start_at}-#{s.end_at}"}.join ', '}]"
|
252
258
|
|
253
|
-
Process.duck_audio inter_o, over_a_o, silence, main_av_o,
|
259
|
+
Process.duck_audio inter_o, over_a_o, silence, main_av_o,
|
260
|
+
process_options: {ignore_broken_pipe: ignore_broken_pipe_was, timeout: process.timeout},
|
261
|
+
video: channel(:video), audio: channel(:audio)
|
254
262
|
end
|
255
263
|
end
|
256
264
|
|
data/lib/ffmprb/process.rb
CHANGED
@@ -44,10 +44,11 @@ module Ffmprb
|
|
44
44
|
volume_lo: duck_audio_volume_lo,
|
45
45
|
volume_hi: duck_audio_volume_hi,
|
46
46
|
silent_min: duck_audio_silent_min,
|
47
|
+
process_options: {},
|
47
48
|
video:, # NOTE Temporarily, video should not be here
|
48
49
|
audio:
|
49
50
|
)
|
50
|
-
Ffmprb.process do
|
51
|
+
Ffmprb.process **process_options do
|
51
52
|
|
52
53
|
in_main = input(av_main_i)
|
53
54
|
in_over = input(a_overlay_i)
|
@@ -80,13 +81,14 @@ module Ffmprb
|
|
80
81
|
|
81
82
|
end
|
82
83
|
|
83
|
-
|
84
|
+
attr_accessor :timeout
|
85
|
+
attr_accessor :ignore_broken_pipe
|
84
86
|
|
85
87
|
def initialize(*args, **opts)
|
86
88
|
@inputs, @outputs = [], []
|
87
|
-
|
89
|
+
self.timeout = opts.delete(:timeout) || self.class.timeout
|
88
90
|
|
89
|
-
|
91
|
+
self.ignore_broken_pipe = opts.delete(:ignore_broken_pipe)
|
90
92
|
fail Error, "Unknown options: #{opts}" unless opts.empty?
|
91
93
|
end
|
92
94
|
|
@@ -107,7 +109,7 @@ module Ffmprb
|
|
107
109
|
end
|
108
110
|
|
109
111
|
def output(io, video: true, audio: true, &blk)
|
110
|
-
Output.new(io,
|
112
|
+
Output.new(io, self,
|
111
113
|
video: channel_params(video, self.class.output_video_options),
|
112
114
|
audio: channel_params(audio, self.class.output_audio_options)
|
113
115
|
).tap do |out|
|
@@ -116,6 +118,10 @@ module Ffmprb
|
|
116
118
|
end
|
117
119
|
end
|
118
120
|
|
121
|
+
def output_index(output)
|
122
|
+
@outputs.index output
|
123
|
+
end
|
124
|
+
|
119
125
|
# NOTE the one and the only entry-point processing function which spawns threads etc
|
120
126
|
def run(limit: nil) # TODO (async: false)
|
121
127
|
# NOTE this is both for the future async: option and according to
|
data/lib/ffmprb/version.rb
CHANGED
data/lib/ffmprb.rb
CHANGED
@@ -16,10 +16,10 @@ module Ffmprb
|
|
16
16
|
class << self
|
17
17
|
|
18
18
|
# TODO limit:
|
19
|
-
def process(*args, &blk)
|
19
|
+
def process(*args, **opts, &blk)
|
20
20
|
fail Error, "process: nothing ;( gimme a block!" unless blk
|
21
21
|
|
22
|
-
process = Process.new
|
22
|
+
process = Process.new(**opts)
|
23
23
|
|
24
24
|
logger.debug "Starting process with #{args} in #{blk.source_location}"
|
25
25
|
|