ffmprb 0.9.0 → 0.9.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|
|