ffmpeg-screenrecorder 1.0.0.beta2 → 1.0.0.beta3
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/README.md +30 -3
- data/ffmpeg-screenrecorder.gemspec +3 -3
- data/lib/ffmpeg/recorder_options.rb +36 -4
- data/lib/ffmpeg/screenrecorder.rb +25 -0
- data/lib/ffmpeg/windows.rb +20 -4
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a9440c4355488a734176f7c2f1efed255cb4ccb48b5a92ef3ca266597af1ee95
|
4
|
+
data.tar.gz: ce51483334355bc4768c655b6bbc644eca9ea9ccc9bea6402a3855bd4032923f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1884a94f4f2725cbdc2e61d323c0b2fab850e5e5d44552f96f9066a0dc4b51076d13f1f4a3de442189187ddb3f5cd9d6ea44466fcff62b20a84e20a4aa66787c
|
7
|
+
data.tar.gz: 859acd8e9f125033e7971c9d021cde9960b04123ce9b63c4f40ecc6af45a33b3cb34d7711e4d9ddd1a27e4aa5a0bfc88d6776946bb5dcafb6d9082531f9173c0
|
data/README.md
CHANGED
@@ -2,12 +2,35 @@
|
|
2
2
|
|
3
3
|
Ruby gem to record your computer screen - desktop or specific application/window - using [FFMPEG](https://www.ffmpeg.org/).
|
4
4
|
|
5
|
-
##
|
5
|
+
## Windows Only
|
6
6
|
|
7
|
-
Only supports Windows
|
7
|
+
Only supports Windows as of version `1.0.0-beta3`. Linux and macOS support will be added before the final release of `v1.0.0`.
|
8
8
|
|
9
9
|
## Installation
|
10
10
|
|
11
|
+
[Download](https://www.ffmpeg.org/download.html), extract and add the location of `ffmpeg.exe` to your ENV `PATH` variable. Make sure you can execute ffmpeg:
|
12
|
+
|
13
|
+
C:\Users\Lakshya Kapoor>ffmpeg -version
|
14
|
+
ffmpeg version N-92132-g0a41a8bf29 Copyright (c) 2000-2018 the FFmpeg developers
|
15
|
+
built with gcc 8.2.1 (GCC) 20180813
|
16
|
+
configuration: --enable-gpl --enable-version3 --enable-sdl2 --enable-fontconfig --enable-g
|
17
|
+
nutls --enable-iconv --enable-libass --enable-libbluray --enable-libfreetype --enable-libm
|
18
|
+
p3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable
|
19
|
+
-libopus --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libtheora --enable
|
20
|
+
-libtwolame --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable
|
21
|
+
-libx265 --enable-libxml2 --enable-libzimg --enable-lzma --enable-zlib --enable-gmp --enab
|
22
|
+
le-libvidstab --enable-libvorbis --enable-libvo-amrwbenc --enable-libmysofa --enable-libsp
|
23
|
+
eex --enable-libxvid --enable-libaom --enable-libmfx --enable-amf --enable-ffnvcodec --ena
|
24
|
+
ble-cuvid --enable-d3d11va --enable-nvenc --enable-nvdec --enable-dxva2 --enable-avisynth
|
25
|
+
libavutil 56. 19.101 / 56. 19.101
|
26
|
+
libavcodec 58. 32.100 / 58. 32.100
|
27
|
+
libavformat 58. 18.104 / 58. 18.104
|
28
|
+
libavdevice 58. 4.105 / 58. 4.105
|
29
|
+
libavfilter 7. 33.100 / 7. 33.100
|
30
|
+
libswscale 5. 2.100 / 5. 2.100
|
31
|
+
libswresample 3. 2.100 / 3. 2.100
|
32
|
+
libpostproc 55. 2.100 / 55. 2.100
|
33
|
+
|
11
34
|
Add this line to your application's Gemfile:
|
12
35
|
|
13
36
|
```ruby
|
@@ -69,9 +92,13 @@ opts = { output: 'ffmpeg-screenrecorder-firefox.mp4',
|
|
69
92
|
# Stop recording
|
70
93
|
@recorder.stop
|
71
94
|
|
72
|
-
|
95
|
+
browser.quit
|
73
96
|
```
|
74
97
|
|
98
|
+
<b>Note</b>:
|
99
|
+
1. Always stop the recording before closing the application. Otherwise, ffmpeg will not exit gracefully and may produce an invalid video file.
|
100
|
+
2. If you're launching multiple applications or testing an application at different window sizes, recording the `desktop` is a better option.
|
101
|
+
|
75
102
|
## Development
|
76
103
|
|
77
104
|
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
@@ -3,14 +3,14 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
3
3
|
|
4
4
|
Gem::Specification.new do |spec|
|
5
5
|
spec.name = 'ffmpeg-screenrecorder'
|
6
|
-
spec.version = '1.0.0.
|
6
|
+
spec.version = '1.0.0.beta3'
|
7
7
|
spec.authors = ['Lakshya Kapoor']
|
8
8
|
spec.email = ['kapoorlakshya@gmail.com']
|
9
9
|
|
10
10
|
spec.summary = 'Record your computer screen using ffmpeg via Ruby.'
|
11
11
|
spec.description = 'Ruby gem to record your computer screen - desktop or specific application/window' \
|
12
|
-
' - using
|
13
|
-
spec.homepage = '
|
12
|
+
' - using FFMPEG (https://www.ffmpeg.org).'
|
13
|
+
spec.homepage = 'http://github.com/kapoorlakshya/ffmpeg-screenrecorder'
|
14
14
|
spec.license = 'MIT'
|
15
15
|
|
16
16
|
spec.files = Dir.chdir(File.expand_path(__dir__)) do
|
@@ -1,42 +1,71 @@
|
|
1
1
|
module FFMPEG
|
2
|
+
# @since 1.0.0-beta2
|
2
3
|
class RecorderOptions
|
3
4
|
|
4
5
|
def initialize(options)
|
5
6
|
@options = verify_options options
|
6
7
|
end
|
7
8
|
|
9
|
+
#
|
10
|
+
# Returns given recording format
|
11
|
+
#
|
8
12
|
def format
|
9
13
|
@options[:format]
|
10
14
|
end
|
11
15
|
|
16
|
+
#
|
17
|
+
# Returns given framerate
|
18
|
+
#
|
12
19
|
def framerate
|
13
20
|
@options[:framerate]
|
14
21
|
end
|
15
22
|
|
23
|
+
#
|
24
|
+
# Returns given input file or infile
|
25
|
+
#
|
16
26
|
def infile
|
17
27
|
@options[:infile]
|
18
28
|
end
|
19
29
|
|
30
|
+
#
|
31
|
+
# Returns given output filepath
|
32
|
+
#
|
20
33
|
def output
|
21
34
|
@options[:output]
|
22
35
|
end
|
23
36
|
|
37
|
+
#
|
38
|
+
# Returns given values that are optional
|
39
|
+
#
|
24
40
|
def advanced
|
25
41
|
@options[:advanced]
|
26
42
|
end
|
27
43
|
|
44
|
+
#
|
45
|
+
# Returns given log filename
|
46
|
+
#
|
28
47
|
def log
|
29
48
|
@options[:log]
|
30
49
|
end
|
31
50
|
|
51
|
+
#
|
52
|
+
# Returns given log_level
|
53
|
+
#
|
32
54
|
def log_level
|
33
55
|
@options[:log_level]
|
34
56
|
end
|
35
57
|
|
58
|
+
#
|
59
|
+
# Returns all given options
|
60
|
+
#
|
36
61
|
def all
|
37
62
|
@options
|
38
63
|
end
|
39
64
|
|
65
|
+
#
|
66
|
+
# Returns a String with all options parsed as a String,
|
67
|
+
# ready for the ffmpeg process to use
|
68
|
+
#
|
40
69
|
def parsed
|
41
70
|
vals = "-f #{@options[:format]} "
|
42
71
|
vals << "-r #{@options[:framerate]} "
|
@@ -49,7 +78,8 @@ module FFMPEG
|
|
49
78
|
private
|
50
79
|
|
51
80
|
#
|
52
|
-
# Verifies the required options are provided
|
81
|
+
# Verifies the required options are provided and returns
|
82
|
+
# the given options Hash
|
53
83
|
#
|
54
84
|
def verify_options(options)
|
55
85
|
missing_options = required_options.select { |req| options[req].nil? }
|
@@ -60,7 +90,7 @@ module FFMPEG
|
|
60
90
|
end
|
61
91
|
|
62
92
|
#
|
63
|
-
# Returns Array of
|
93
|
+
# Returns Array of required options sa Symbols
|
64
94
|
#
|
65
95
|
def required_options
|
66
96
|
# -f format
|
@@ -85,8 +115,10 @@ module FFMPEG
|
|
85
115
|
end
|
86
116
|
|
87
117
|
#
|
88
|
-
#
|
89
|
-
#
|
118
|
+
# Returns portion of the command which determines
|
119
|
+
# if the ffmpeg output will be logged to a file
|
120
|
+
# or completely ignored based on if the user
|
121
|
+
# provides a log filepath in the options.
|
90
122
|
#
|
91
123
|
def ffmpeg_log_to(file)
|
92
124
|
return " 2> #{file}" if file
|
@@ -4,6 +4,7 @@ require_relative 'recorder_options'
|
|
4
4
|
require_relative 'windows'
|
5
5
|
|
6
6
|
module FFMPEG
|
7
|
+
# @since 1.0.0-beta1
|
7
8
|
class Screenrecorder
|
8
9
|
extend Windows
|
9
10
|
|
@@ -16,6 +17,9 @@ module FFMPEG
|
|
16
17
|
initialize_logger(@options.log_level || Logger::ERROR)
|
17
18
|
end
|
18
19
|
|
20
|
+
#
|
21
|
+
# Starts the recording
|
22
|
+
#
|
19
23
|
def start
|
20
24
|
@video = nil # New file
|
21
25
|
start_time = Time.now
|
@@ -25,6 +29,9 @@ module FFMPEG
|
|
25
29
|
FFMPEG.logger.info 'Recording...'
|
26
30
|
end
|
27
31
|
|
32
|
+
#
|
33
|
+
# Stops the recording
|
34
|
+
#
|
28
35
|
def stop
|
29
36
|
FFMPEG.logger.debug 'Stopping ffmpeg.exe...'
|
30
37
|
elapsed = kill_ffmpeg
|
@@ -35,6 +42,10 @@ module FFMPEG
|
|
35
42
|
|
36
43
|
private
|
37
44
|
|
45
|
+
#
|
46
|
+
# Launches the ffmpeg binary using a generated command based on
|
47
|
+
# the given options.
|
48
|
+
#
|
38
49
|
def start_ffmpeg
|
39
50
|
FFMPEG.logger.debug "Command: #{command}"
|
40
51
|
process = IO.popen(command, 'r+')
|
@@ -42,6 +53,9 @@ module FFMPEG
|
|
42
53
|
process
|
43
54
|
end
|
44
55
|
|
56
|
+
#
|
57
|
+
# Sends 'q' to the ffmpeg binary to gracefully stop the process.
|
58
|
+
#
|
45
59
|
def kill_ffmpeg
|
46
60
|
@process.puts 'q' # Gracefully exit ffmpeg
|
47
61
|
elapsed = wait_for_io_eof(5)
|
@@ -49,6 +63,9 @@ module FFMPEG
|
|
49
63
|
elapsed
|
50
64
|
end
|
51
65
|
|
66
|
+
#
|
67
|
+
# Initializes the logger with the given log level.
|
68
|
+
#
|
52
69
|
def initialize_logger(level)
|
53
70
|
FFMPEG.logger.progname = 'FFMPEG'
|
54
71
|
FFMPEG.logger.level = level
|
@@ -58,11 +75,19 @@ module FFMPEG
|
|
58
75
|
FFMPEG.logger.debug 'Logger initialized.'
|
59
76
|
end
|
60
77
|
|
78
|
+
#
|
79
|
+
# Generates the command line arguments based on the given
|
80
|
+
# options.
|
81
|
+
#
|
61
82
|
def command
|
62
83
|
cmd = "#{FFMPEG.ffmpeg_binary} -y "
|
63
84
|
cmd << @options.parsed
|
64
85
|
end
|
65
86
|
|
87
|
+
#
|
88
|
+
# Waits for IO#eof? to return true
|
89
|
+
# after 'q' is sent to the ffmpeg process.
|
90
|
+
#
|
66
91
|
def wait_for_io_eof(timeout)
|
67
92
|
start = Time.now
|
68
93
|
Timeout.timeout(timeout) do
|
data/lib/ffmpeg/windows.rb
CHANGED
@@ -1,18 +1,34 @@
|
|
1
1
|
module FFMPEG
|
2
|
+
# @since 1.0.0-beta2
|
2
3
|
module Windows
|
3
4
|
|
5
|
+
#
|
6
|
+
# Returns a list of available window titles for the given application (process) name.
|
7
|
+
#
|
4
8
|
def window_titles(application)
|
5
9
|
FFMPEG.logger.debug "Retrieving available windows for: #{application}"
|
6
10
|
WindowGrabber.new.available_windows_for application
|
7
11
|
end
|
8
12
|
|
13
|
+
# @since 1.0.0-beta2
|
9
14
|
class WindowGrabber
|
15
|
+
#
|
16
|
+
# Returns a cleaned up list of available window titles
|
17
|
+
# for the given application (process) name.
|
18
|
+
# Note: Only supports Windows OS as of version beta2.
|
19
|
+
#
|
10
20
|
def available_windows_for(application)
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
21
|
+
raw_list = `tasklist /v /fi "imagename eq #{application}.exe" /fo list | findstr Window`
|
22
|
+
.split("\n")
|
23
|
+
.reject { |title| title == 'Window Title: N/A' }
|
24
|
+
final_list = raw_list.map { |i| i.gsub('Window Title: ', '') } # Make it user friendly
|
25
|
+
|
26
|
+
raise ApplicationNotFound, "No open windows found for: #{application}.exe" if final_list.empty?
|
27
|
+
final_list
|
15
28
|
end
|
16
29
|
end
|
30
|
+
|
31
|
+
# @since 1.0.0-beta3
|
32
|
+
class ApplicationNotFound < StandardError; end
|
17
33
|
end # module Windows
|
18
34
|
end # module FFMPEG
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
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.beta3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Lakshya Kapoor
|
@@ -123,7 +123,7 @@ dependencies:
|
|
123
123
|
- !ruby/object:Gem::Version
|
124
124
|
version: '1.0'
|
125
125
|
description: Ruby gem to record your computer screen - desktop or specific application/window
|
126
|
-
- using
|
126
|
+
- using FFMPEG (https://www.ffmpeg.org).
|
127
127
|
email:
|
128
128
|
- kapoorlakshya@gmail.com
|
129
129
|
executables: []
|
@@ -145,7 +145,7 @@ files:
|
|
145
145
|
- lib/ffmpeg/recorder_options.rb
|
146
146
|
- lib/ffmpeg/screenrecorder.rb
|
147
147
|
- lib/ffmpeg/windows.rb
|
148
|
-
homepage:
|
148
|
+
homepage: http://github.com/kapoorlakshya/ffmpeg-screenrecorder
|
149
149
|
licenses:
|
150
150
|
- MIT
|
151
151
|
metadata: {}
|