ffmpeg-screenrecorder 1.0.0.beta4 → 1.0.0.beta5
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/Gemfile +3 -3
- data/README.md +7 -7
- data/Rakefile +6 -6
- data/bin/console +14 -14
- data/ffmpeg-screenrecorder.gemspec +32 -32
- data/lib/ffmpeg/recorder_errors.rb +10 -0
- data/lib/ffmpeg/recorder_options.rb +36 -13
- data/lib/ffmpeg/recording_regions.rb +29 -8
- data/lib/ffmpeg/screenrecorder.rb +17 -4
- data/lib/ffmpeg/version.rb +2 -2
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2a72ed1c811611468b93f3a1677b651881834c3e94aa52582564a1bdee2aba60
|
4
|
+
data.tar.gz: cfce5bdfe5c575a77b7bf12d994a58c406ede56b529704ce5c9ac9d157e72d72
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6e74b55cb1c1e6cd0e72a4a7d59e8f171b81627102f17a17ee3020c74e672ef0c1df4b0bd1a3c4d577406209d5802d8b6fb009b07266917f9709f84ff02c3f5c
|
7
|
+
data.tar.gz: 06125f14582ae639177ceed36295de452479b6abb76f70654cb71168ca46dac4210c7b43a9c05e5133cd55b8b27aa40baf46920012b4b3f4994563d2c47eb68a
|
data/Gemfile
CHANGED
@@ -1,3 +1,3 @@
|
|
1
|
-
source
|
2
|
-
|
3
|
-
gemspec
|
1
|
+
source 'https://rubygems.org'
|
2
|
+
|
3
|
+
gemspec
|
data/README.md
CHANGED
@@ -1,12 +1,12 @@
|
|
1
|
-
# FFMPEG::
|
1
|
+
# FFMPEG::ScreenRecorder
|
2
2
|
|
3
3
|
[](https://badge.fury.io/rb/ffmpeg-screenrecorder)
|
4
4
|
|
5
5
|
Ruby gem to record your computer screen - desktop or specific application/window - using [FFmpeg](https://www.ffmpeg.org/).
|
6
6
|
|
7
|
-
##
|
7
|
+
## Compatibility
|
8
8
|
|
9
|
-
|
9
|
+
Supports Windows and Linux as of version `1.0.0-beta5`. macOS support will be added before the final release of `v1.0.0`.
|
10
10
|
|
11
11
|
## Installation
|
12
12
|
|
@@ -57,7 +57,7 @@ opts = { output: 'ffmpeg-screenrecorder-desktop.mp4',
|
|
57
57
|
framerate: 30.0,
|
58
58
|
device: 'gdigrab',
|
59
59
|
log: 'ffmpeg-screenrecorder-log.txt' }
|
60
|
-
@recorder = FFMPEG::
|
60
|
+
@recorder = FFMPEG::ScreenRecorder.new(opts)
|
61
61
|
|
62
62
|
# Start recording
|
63
63
|
@recorder.start
|
@@ -70,13 +70,13 @@ opts = { output: 'ffmpeg-screenrecorder-desktop.mp4',
|
|
70
70
|
# Recording file will be available: ffmpeg-screenrecorder-desktop.mp4
|
71
71
|
```
|
72
72
|
|
73
|
-
##### Record Specific Application/Window
|
73
|
+
##### Record Specific Application/Window - gdigrab (Windows) Only
|
74
74
|
```
|
75
75
|
require 'watir'
|
76
76
|
|
77
77
|
browser = Watir::Browser.new :firefox
|
78
78
|
|
79
|
-
FFMPEG::
|
79
|
+
FFMPEG::RecordingRegions.fetch('firefox') # Name of exe
|
80
80
|
#=> "Mozilla Firefox"
|
81
81
|
|
82
82
|
opts = { output: 'ffmpeg-screenrecorder-firefox.mp4',
|
@@ -84,7 +84,7 @@ opts = { output: 'ffmpeg-screenrecorder-firefox.mp4',
|
|
84
84
|
framerate: 30.0,
|
85
85
|
device: 'gdigrab',
|
86
86
|
log: 'ffmpeg-screenrecorder-firefox.txt' }
|
87
|
-
@recorder = FFMPEG::
|
87
|
+
@recorder = FFMPEG::ScreenRecorder.new(opts)
|
88
88
|
|
89
89
|
# Start recording
|
90
90
|
@recorder.start
|
data/Rakefile
CHANGED
@@ -1,6 +1,6 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
|
4
|
-
RSpec::Core::RakeTask.new(:spec)
|
5
|
-
|
6
|
-
task :
|
1
|
+
require 'bundler/gem_tasks'
|
2
|
+
require 'rspec/core/rake_task'
|
3
|
+
|
4
|
+
RSpec::Core::RakeTask.new(:spec)
|
5
|
+
|
6
|
+
task default: :spec
|
data/bin/console
CHANGED
@@ -1,14 +1,14 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
require
|
4
|
-
require
|
5
|
-
|
6
|
-
# You can add fixtures and/or initialization code here to make experimenting
|
7
|
-
# with your gem easier. You can also use a different console, if you like.
|
8
|
-
|
9
|
-
# (If you use this, don't forget to add pry to your Gemfile!)
|
10
|
-
# require "pry"
|
11
|
-
# Pry.start
|
12
|
-
|
13
|
-
require
|
14
|
-
IRB.start(__FILE__)
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'bundler/setup'
|
4
|
+
require 'ffmpeg/screenrecorder'
|
5
|
+
|
6
|
+
# You can add fixtures and/or initialization code here to make experimenting
|
7
|
+
# with your gem easier. You can also use a different console, if you like.
|
8
|
+
|
9
|
+
# (If you use this, don't forget to add pry to your Gemfile!)
|
10
|
+
# require "pry"
|
11
|
+
# Pry.start
|
12
|
+
|
13
|
+
require 'irb'
|
14
|
+
IRB.start(__FILE__)
|
@@ -1,32 +1,32 @@
|
|
1
|
-
lib = File.expand_path('lib', __dir__)
|
2
|
-
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
3
|
-
require 'ffmpeg/version'
|
4
|
-
|
5
|
-
Gem::Specification.new do |spec|
|
6
|
-
spec.name = 'ffmpeg-screenrecorder'
|
7
|
-
spec.version = FFMPEG::
|
8
|
-
spec.authors = ['Lakshya Kapoor']
|
9
|
-
spec.email = ['kapoorlakshya@gmail.com']
|
10
|
-
|
11
|
-
spec.summary = 'Record your computer screen using ffmpeg via Ruby.'
|
12
|
-
spec.description = 'Ruby gem to record your computer screen - desktop or specific application/window' \
|
13
|
-
' - using FFmpeg (https://www.ffmpeg.org).'
|
14
|
-
spec.homepage = 'http://github.com/kapoorlakshya/ffmpeg-screenrecorder'
|
15
|
-
spec.license = 'MIT'
|
16
|
-
|
17
|
-
spec.files = Dir.chdir(File.expand_path(__dir__)) do
|
18
|
-
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
19
|
-
end
|
20
|
-
|
21
|
-
spec.require_paths = ['lib']
|
22
|
-
|
23
|
-
spec.add_development_dependency 'bundler', '~> 1.16'
|
24
|
-
spec.add_development_dependency 'pry-byebug', '~> 3.6'
|
25
|
-
spec.add_development_dependency 'rake', '~> 10.0'
|
26
|
-
spec.add_development_dependency 'rspec', '~> 3.0'
|
27
|
-
spec.add_development_dependency 'watir', '~> 6.0'
|
28
|
-
spec.add_development_dependency 'webdrivers', '~> 3.0'
|
29
|
-
|
30
|
-
spec.add_runtime_dependency 'os', '~> 0.9.0'
|
31
|
-
spec.add_runtime_dependency 'streamio-ffmpeg', '~> 1.0'
|
32
|
-
end
|
1
|
+
lib = File.expand_path('lib', __dir__)
|
2
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
3
|
+
require 'ffmpeg/version'
|
4
|
+
|
5
|
+
Gem::Specification.new do |spec|
|
6
|
+
spec.name = 'ffmpeg-screenrecorder'
|
7
|
+
spec.version = FFMPEG::ScreenRecorder::VERSION
|
8
|
+
spec.authors = ['Lakshya Kapoor']
|
9
|
+
spec.email = ['kapoorlakshya@gmail.com']
|
10
|
+
|
11
|
+
spec.summary = 'Record your computer screen using ffmpeg via Ruby.'
|
12
|
+
spec.description = 'Ruby gem to record your computer screen - desktop or specific application/window' \
|
13
|
+
' - using FFmpeg (https://www.ffmpeg.org).'
|
14
|
+
spec.homepage = 'http://github.com/kapoorlakshya/ffmpeg-screenrecorder'
|
15
|
+
spec.license = 'MIT'
|
16
|
+
|
17
|
+
spec.files = Dir.chdir(File.expand_path(__dir__)) do
|
18
|
+
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
19
|
+
end
|
20
|
+
|
21
|
+
spec.require_paths = ['lib']
|
22
|
+
|
23
|
+
spec.add_development_dependency 'bundler', '~> 1.16'
|
24
|
+
spec.add_development_dependency 'pry-byebug', '~> 3.6'
|
25
|
+
spec.add_development_dependency 'rake', '~> 10.0'
|
26
|
+
spec.add_development_dependency 'rspec', '~> 3.0'
|
27
|
+
spec.add_development_dependency 'watir', '~> 6.0'
|
28
|
+
spec.add_development_dependency 'webdrivers', '~> 3.0'
|
29
|
+
|
30
|
+
spec.add_runtime_dependency 'os', '~> 0.9.0'
|
31
|
+
spec.add_runtime_dependency 'streamio-ffmpeg', '~> 1.0'
|
32
|
+
end
|
@@ -1,7 +1,6 @@
|
|
1
1
|
module FFMPEG
|
2
2
|
# @since 1.0.0-beta2
|
3
3
|
class RecorderOptions
|
4
|
-
|
5
4
|
def initialize(options)
|
6
5
|
@options = verify_options options
|
7
6
|
end
|
@@ -10,7 +9,7 @@ module FFMPEG
|
|
10
9
|
# Returns given recording format
|
11
10
|
#
|
12
11
|
def format
|
13
|
-
|
12
|
+
determine_format
|
14
13
|
end
|
15
14
|
|
16
15
|
#
|
@@ -67,10 +66,10 @@ module FFMPEG
|
|
67
66
|
# ready for the ffmpeg process to use
|
68
67
|
#
|
69
68
|
def parsed
|
70
|
-
vals = "-f #{
|
69
|
+
vals = "-f #{determine_format} "
|
71
70
|
vals << "-r #{@options[:framerate]} "
|
72
71
|
vals << advanced_options if @options[:advanced]
|
73
|
-
vals << "-i #{determine_infile
|
72
|
+
vals << "-i #{determine_infile} "
|
74
73
|
vals << @options[:output]
|
75
74
|
vals << ffmpeg_log_to(@options[:log]) # If provided
|
76
75
|
end
|
@@ -93,11 +92,12 @@ module FFMPEG
|
|
93
92
|
# Returns Array of required options sa Symbols
|
94
93
|
#
|
95
94
|
def required_options
|
96
|
-
# -f format
|
97
95
|
# -r framerate
|
98
96
|
# -i input
|
99
97
|
# output
|
100
|
-
%i[
|
98
|
+
return %i[framerate infile output] unless OS.linux?
|
99
|
+
|
100
|
+
%i[framerate output] # Linux
|
101
101
|
end
|
102
102
|
|
103
103
|
#
|
@@ -108,9 +108,9 @@ module FFMPEG
|
|
108
108
|
raise(ArgumentError, ':advanced cannot be empty.') if options[:advanced].empty?
|
109
109
|
|
110
110
|
arr = []
|
111
|
-
options[:advanced].each
|
111
|
+
options[:advanced].each do |k, v|
|
112
112
|
arr.push "-#{k} #{v}"
|
113
|
-
|
113
|
+
end
|
114
114
|
arr.join(' ') + ' '
|
115
115
|
end
|
116
116
|
|
@@ -122,7 +122,8 @@ module FFMPEG
|
|
122
122
|
#
|
123
123
|
def ffmpeg_log_to(file)
|
124
124
|
return " 2> #{file}" if file
|
125
|
-
|
125
|
+
|
126
|
+
'> nul 2>&1' # No log file given
|
126
127
|
end
|
127
128
|
|
128
129
|
#
|
@@ -130,9 +131,31 @@ module FFMPEG
|
|
130
131
|
# Adds title= qualifier to infile parameter
|
131
132
|
# unless the user is recording the desktop.
|
132
133
|
#
|
133
|
-
def determine_infile
|
134
|
-
|
135
|
-
|
134
|
+
def determine_infile
|
135
|
+
# x11grab doesn't support window capture
|
136
|
+
return ':0.0' if OS.linux?
|
137
|
+
|
138
|
+
return @options[:infile] if @options[:infile] == 'desktop'
|
139
|
+
|
140
|
+
# Windows only
|
141
|
+
%("title=#{@options[:infile]}")
|
142
|
+
end
|
143
|
+
|
144
|
+
#
|
145
|
+
# Returns format based on the current OS.
|
146
|
+
#
|
147
|
+
def determine_format
|
148
|
+
return @options[:format] if @options[:format]
|
149
|
+
|
150
|
+
if OS.windows?
|
151
|
+
'gdigrab'
|
152
|
+
elsif OS.linux?
|
153
|
+
'x11grab'
|
154
|
+
elsif OS.mac?
|
155
|
+
'avfoundation'
|
156
|
+
else
|
157
|
+
raise NotImplementedError, 'Your OS is not supported.'
|
158
|
+
end
|
136
159
|
end
|
137
160
|
end
|
138
|
-
end
|
161
|
+
end
|
@@ -1,11 +1,10 @@
|
|
1
1
|
module FFMPEG
|
2
2
|
# @since 1.0.0-beta4
|
3
3
|
module RecordingRegions
|
4
|
-
|
5
4
|
#
|
6
5
|
# Returns a list of available window titles for the given application (process) name.
|
7
6
|
#
|
8
|
-
def
|
7
|
+
def self.fetch(application)
|
9
8
|
FFMPEG.logger.debug "Retrieving available windows for: #{application}"
|
10
9
|
WindowGrabber.new.available_windows_for application
|
11
10
|
end
|
@@ -18,17 +17,39 @@ module FFMPEG
|
|
18
17
|
# Note: Only supports Windows OS as of version beta2.
|
19
18
|
#
|
20
19
|
def available_windows_for(application)
|
20
|
+
return windows_os(application) if OS.windows?
|
21
|
+
return linux_os(application) if OS.linux?
|
22
|
+
|
23
|
+
raise NotImplementedError, 'Your OS is not supported.'
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
def windows_os(application)
|
21
29
|
raw_list = `tasklist /v /fi "imagename eq #{application}.exe" /fo list | findstr Window`
|
22
|
-
|
23
|
-
|
30
|
+
.split("\n")
|
31
|
+
.reject { |title| title == 'Window Title: N/A' }
|
24
32
|
final_list = raw_list.map { |i| i.gsub('Window Title: ', '') } # Make it user friendly
|
33
|
+
raise RecorderErrors::ApplicationNotFound, "No open windows found for: #{application}.exe" if final_list.empty?
|
25
34
|
|
26
|
-
raise ApplicationNotFound, "No open windows found for: #{application}.exe" if final_list.empty?
|
27
35
|
final_list
|
28
36
|
end
|
29
|
-
end
|
30
37
|
|
31
|
-
|
32
|
-
|
38
|
+
def linux_os(application)
|
39
|
+
raise DependencyNotFound, 'wmctrl is not installed. Run: sudo apt-get install wmctrl.' unless wmctrl_installed?
|
40
|
+
|
41
|
+
final_list = `wmctrl -l | awk '{$3=""; $2=""; $1=""; print $0}'` # Returns all open windows
|
42
|
+
.split("\n")
|
43
|
+
.map(&:strip)
|
44
|
+
.select { |t| t.match?(/#{application}/i) } # Narrow down to given application
|
45
|
+
raise RecorderErrors::ApplicationNotFound, "No open windows found for: #{application}" if final_list.empty?
|
46
|
+
|
47
|
+
final_list
|
48
|
+
end
|
49
|
+
|
50
|
+
def wmctrl_installed?
|
51
|
+
!`which wmctrl`.empty? # "" when not found
|
52
|
+
end
|
53
|
+
end
|
33
54
|
end # module Windows
|
34
55
|
end # module FFMPEG
|
@@ -1,13 +1,12 @@
|
|
1
1
|
require 'streamio-ffmpeg'
|
2
2
|
require 'os'
|
3
|
+
require_relative 'recorder_errors'
|
3
4
|
require_relative 'recorder_options'
|
4
5
|
require_relative 'recording_regions'
|
5
6
|
|
6
7
|
module FFMPEG
|
7
|
-
# @since 1.0.0-
|
8
|
-
class
|
9
|
-
extend RecordingRegions
|
10
|
-
|
8
|
+
# @since 1.0.0-beta
|
9
|
+
class ScreenRecorder
|
11
10
|
attr_reader :options, :video
|
12
11
|
|
13
12
|
def initialize(options = {})
|
@@ -47,7 +46,10 @@ module FFMPEG
|
|
47
46
|
# the given options.
|
48
47
|
#
|
49
48
|
def start_ffmpeg
|
49
|
+
raise RecorderErrors::DependencyNotFound, 'ffmpeg binary not found.' unless ffmpeg_exists?
|
50
|
+
|
50
51
|
FFMPEG.logger.debug "Command: #{command}"
|
52
|
+
puts "Command: #{command}" # @todo Remove this after debugging
|
51
53
|
process = IO.popen(command, 'r+')
|
52
54
|
sleep(1.5) # Takes ~1.5s on average to initialize
|
53
55
|
process
|
@@ -96,5 +98,16 @@ module FFMPEG
|
|
96
98
|
FFMPEG.logger.debug "IO#eof? #{@process.eof?}"
|
97
99
|
Time.now - start
|
98
100
|
end
|
101
|
+
|
102
|
+
#
|
103
|
+
# Returns true if ffmpeg binary is found.
|
104
|
+
#
|
105
|
+
def ffmpeg_exists?
|
106
|
+
return !`which ffmpeg`.empty? if OS.linux? # "" if not found
|
107
|
+
|
108
|
+
return !`where ffmpeg`.empty? if OS.windows?
|
109
|
+
|
110
|
+
true # @todo Check on windows
|
111
|
+
end
|
99
112
|
end # class Recorder
|
100
113
|
end # module FFMPEG
|
data/lib/ffmpeg/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ffmpeg-screenrecorder
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.0.
|
4
|
+
version: 1.0.0.beta5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Lakshya Kapoor
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-11-
|
11
|
+
date: 2018-11-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -142,6 +142,7 @@ files:
|
|
142
142
|
- bin/setup
|
143
143
|
- ffmpeg-screenrecorder.gemspec
|
144
144
|
- lib/ffmpeg.rb
|
145
|
+
- lib/ffmpeg/recorder_errors.rb
|
145
146
|
- lib/ffmpeg/recorder_options.rb
|
146
147
|
- lib/ffmpeg/recording_regions.rb
|
147
148
|
- lib/ffmpeg/screenrecorder.rb
|