ffmpeg-screenrecorder 1.0.0.beta10 → 1.0.0.beta11

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 362b8478473163a4c1b072b4bd556560dbad3fd6f50f258e6f6fbebdfb01955c
4
- data.tar.gz: c9f64e399242f570bf87e0dd1483b92e2bd63c17e8ec97aebe2686067f446f8c
3
+ metadata.gz: c53985bec23bb71bb24147ee248aa12bbca3ac4326fea85272a50901c35ea035
4
+ data.tar.gz: 1fc08dcbfbf387f288461ae48930b8efd2417cb541ed85ce43f01e99e5ba4cab
5
5
  SHA512:
6
- metadata.gz: 44287d64e556d2ae9ae720c55d9fddeb19acb9085943b083bc88c8eac6c15cebd97ef40f085d01d12a21bddbd4501a2e0eed2036aca5a0f2a8d44f5a52f2ba4c
7
- data.tar.gz: f94b1e95dd4adb95f3b8f1e0c3f7c374c55009f9afafeef37475aefffb43a0c592c6dd8f27cf152ffad1a9df955a1a78df1730904ac36774352d73de58c59232
6
+ metadata.gz: cac78ed89acfebc0a9f0533616e8dfc2114f4199919f295076e7bc9874993322ef38dd3793f57a7210fb2235fd5c11923c6a6ab850fdc6afa73a5f1b03f271dc
7
+ data.tar.gz: c18942bb29c48f98f7457c67339c3383385c4d099da7c83d1e46491f58f482d835cc22e0a2f18aafe15085762f322ca7b7f878fe66bd8d62756c53dc80d2da18
@@ -0,0 +1,15 @@
1
+ ### Summary
2
+ A clear and concise description of what the bug is.
3
+
4
+ ### Debug Info
5
+ Please provide the following information:
6
+
7
+ * Operating system - Microsoft Windows, Linux, or macOS.
8
+ * `opts` Hash used for the recorder.
9
+ * Recorder log (`ffmpeg.log`) file as a gist or on pastebin.com.
10
+ * Set `log_level: Logger::DEBUG`, run the recorder, and share the
11
+ console output as a gist or on pastebin.com.
12
+
13
+ ### Expected Behavior
14
+
15
+ ### Actual Behavior
data/.gitignore CHANGED
@@ -1,108 +1,108 @@
1
- Gemfile.lock # Part of best practice
2
-
3
- # Created by https://www.gitignore.io/api/rubymine+all
4
-
5
- ### RubyMine+all ###
6
- # Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and WebStorm
7
- # Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
8
-
9
- /.bundle/
10
- /.yardoc
11
- /_yardoc/
12
- /coverage/
13
- /doc/
14
- /pkg/
15
- /spec/reports/
16
- /tmp/
17
- /webdrivers_bin
18
- *.log
19
- *.mkv
20
- *.mp4
21
- *.avi
22
- *.gif
23
-
24
- Gemfile.lock
25
-
26
- # rspec failure tracking
27
- .rspec_status
28
-
29
- # User-specific stuff
30
- .idea/
31
- .idea/**/workspace.xml
32
- .idea/**/tasks.xml
33
- .idea/**/usage.statistics.xml
34
- .idea/**/dictionaries
35
- .idea/**/shelf
36
-
37
- # Generated files
38
- .idea/**/contentModel.xml
39
-
40
- # Sensitive or high-churn files
41
- .idea/**/dataSources/
42
- .idea/**/dataSources.ids
43
- .idea/**/dataSources.local.xml
44
- .idea/**/sqlDataSources.xml
45
- .idea/**/dynamic.xml
46
- .idea/**/uiDesigner.xml
47
- .idea/**/dbnavigator.xml
48
-
49
- # Gradle
50
- .idea/**/gradle.xml
51
- .idea/**/libraries
52
-
53
- # Gradle and Maven with auto-import
54
- # When using Gradle or Maven with auto-import, you should exclude module files,
55
- # since they will be recreated, and may cause churn. Uncomment if using
56
- # auto-import.
57
- # .idea/modules.xml
58
- # .idea/*.iml
59
- # .idea/modules
60
-
61
- # CMake
62
- cmake-build-*/
63
-
64
- # Mongo Explorer plugin
65
- .idea/**/mongoSettings.xml
66
-
67
- # File-based project format
68
- *.iws
69
-
70
- # IntelliJ
71
- out/
72
-
73
- # mpeltonen/sbt-idea plugin
74
- .idea_modules/
75
-
76
- # JIRA plugin
77
- atlassian-ide-plugin.xml
78
-
79
- # Cursive Clojure plugin
80
- .idea/replstate.xml
81
-
82
- # Crashlytics plugin (for Android Studio and IntelliJ)
83
- com_crashlytics_export_strings.xml
84
- crashlytics.properties
85
- crashlytics-build.properties
86
- fabric.properties
87
-
88
- # Editor-based Rest Client
89
- .idea/httpRequests
90
-
91
- # Android studio 3.1+ serialized cache file
92
- .idea/caches/build_file_checksums.ser
93
-
94
- ### RubyMine+all Patch ###
95
- # Ignores the whole .idea folder and all .iml files
96
- # See https://github.com/joeblau/gitignore.io/issues/186 and https://github.com/joeblau/gitignore.io/issues/360
97
-
98
- .idea/
99
-
100
- # Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-249601023
101
-
102
- *.iml
103
- modules.xml
104
- .idea/misc.xml
105
- *.ipr
106
-
107
-
1
+ Gemfile.lock # Part of best practice
2
+
3
+ # Created by https://www.gitignore.io/api/rubymine+all
4
+
5
+ ### RubyMine+all ###
6
+ # Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and WebStorm
7
+ # Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
8
+
9
+ /.bundle/
10
+ /.yardoc
11
+ /_yardoc/
12
+ /coverage/
13
+ /doc/
14
+ /pkg/
15
+ /spec/reports/
16
+ /tmp/
17
+ /webdrivers_bin
18
+ *.log
19
+ *.mkv
20
+ *.mp4
21
+ *.avi
22
+ *.gif
23
+
24
+ Gemfile.lock
25
+
26
+ # rspec failure tracking
27
+ .rspec_status
28
+
29
+ # User-specific stuff
30
+ .idea/
31
+ .idea/**/workspace.xml
32
+ .idea/**/tasks.xml
33
+ .idea/**/usage.statistics.xml
34
+ .idea/**/dictionaries
35
+ .idea/**/shelf
36
+
37
+ # Generated files
38
+ .idea/**/contentModel.xml
39
+
40
+ # Sensitive or high-churn files
41
+ .idea/**/dataSources/
42
+ .idea/**/dataSources.ids
43
+ .idea/**/dataSources.local.xml
44
+ .idea/**/sqlDataSources.xml
45
+ .idea/**/dynamic.xml
46
+ .idea/**/uiDesigner.xml
47
+ .idea/**/dbnavigator.xml
48
+
49
+ # Gradle
50
+ .idea/**/gradle.xml
51
+ .idea/**/libraries
52
+
53
+ # Gradle and Maven with auto-import
54
+ # When using Gradle or Maven with auto-import, you should exclude module files,
55
+ # since they will be recreated, and may cause churn. Uncomment if using
56
+ # auto-import.
57
+ # .idea/modules.xml
58
+ # .idea/*.iml
59
+ # .idea/modules
60
+
61
+ # CMake
62
+ cmake-build-*/
63
+
64
+ # Mongo Explorer plugin
65
+ .idea/**/mongoSettings.xml
66
+
67
+ # File-based project format
68
+ *.iws
69
+
70
+ # IntelliJ
71
+ out/
72
+
73
+ # mpeltonen/sbt-idea plugin
74
+ .idea_modules/
75
+
76
+ # JIRA plugin
77
+ atlassian-ide-plugin.xml
78
+
79
+ # Cursive Clojure plugin
80
+ .idea/replstate.xml
81
+
82
+ # Crashlytics plugin (for Android Studio and IntelliJ)
83
+ com_crashlytics_export_strings.xml
84
+ crashlytics.properties
85
+ crashlytics-build.properties
86
+ fabric.properties
87
+
88
+ # Editor-based Rest Client
89
+ .idea/httpRequests
90
+
91
+ # Android studio 3.1+ serialized cache file
92
+ .idea/caches/build_file_checksums.ser
93
+
94
+ ### RubyMine+all Patch ###
95
+ # Ignores the whole .idea folder and all .iml files
96
+ # See https://github.com/joeblau/gitignore.io/issues/186 and https://github.com/joeblau/gitignore.io/issues/360
97
+
98
+ .idea/
99
+
100
+ # Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-249601023
101
+
102
+ *.iml
103
+ modules.xml
104
+ .idea/misc.xml
105
+ *.ipr
106
+
107
+
108
108
  # End of https://www.gitignore.io/api/rubymine+all
@@ -1,24 +1,32 @@
1
- ---
2
- sudo: required
3
- os:
4
- - linux
5
- language: ruby
6
- cache: bundler
7
- branches:
8
- only:
9
- - master
10
- rvm:
11
- - 2.5.3
12
- addons:
13
- firefox: latest
14
- before_install:
15
- - gem update --system
16
- - gem install bundler
17
- - bundle update
18
- before_script:
19
- - sudo add-apt-repository -y ppa:mc3man/trusty-media
20
- - sudo apt-get update
21
- - sudo apt-get install -y ffmpeg
22
- - ffmpeg -hwaccels
23
- - sudo apt-get install wmctrl
24
- script: xvfb-run --server-args="-screen 0 1024x768x24" rake spec
1
+ ---
2
+ sudo: required
3
+ dist: xenial
4
+ language: ruby
5
+ cache: bundler
6
+
7
+ branches:
8
+ only:
9
+ - /.*/
10
+
11
+ rvm:
12
+ - 2.3.8
13
+ - 2.4.5
14
+ - 2.5.3
15
+ - 2.6.1
16
+
17
+ env:
18
+ - DISPLAY=":99"
19
+
20
+ addons:
21
+ firefox: latest
22
+ chrome: stable
23
+
24
+ before_install:
25
+ - gem update --system --no-document
26
+
27
+ before_script:
28
+ - sudo apt-get install -y ffmpeg
29
+ - ffmpeg -hwaccels
30
+ - sudo apt-get install wmctrl
31
+
32
+ script: xvfb-run --server-args=":99 -ac -screen 0 1024x768x24" bundle exec rake spec
data/CHANGES.md CHANGED
@@ -1,52 +1,53 @@
1
- ### 1.0.0.beta10 (2019-02-05)
2
- * Fixed an edge case in Microsoft Windows specific implementation of
3
- `WindowTitles#fetch` where processes with mismatching names and window
4
- titles, such as process `"Calculator.exe"` with window title `"CicMarshalWnd"`,
5
- were omitted ([#35](https://github.com/kapoorlakshya/ffmpeg-screenrecorder/issues/35)).
6
- This fix also prints a warning when this mismatch occurs.
7
- * The fix for #35 introduces a mild inconvenience when using
8
- applications like Chrome, which spawn a new process per window or
9
- extension. `#fetch` now returns titles for these additional processes
10
- with the visible window (web page) title. In a future release, you will
11
- be able to use something like `full_match: true` to prevent this.
12
- * Fixed bug in Linux specific `WindowTitles#fetch` implementation where
13
- the filter by application name logic was removed. This filter is required
14
- on Linux here because `wmctrl` returns all open window titles unlike
15
- Microsoft Windows where `taskmgr` allows us get window titles by process
16
- name.
17
- * On Linux, you are now required to provide the `input` as `"desktop"`
18
- or a display number, such as `":0.0"`. Run `echo $DISPLAY` to check your display number.
19
- * QOL improvements - Type checking of inputs, spec cleanup, added more
20
- tests, and fixed rubocop warnings.
21
-
22
- ### 1.0.0.beta9 (2019-01-22)
23
-
24
- * :warning: `FFMPEG::RecordingRegions` is now `FFMPEG::WindowTitles`, so the module name is true to the function it provides.
25
- * Added support for for a user given path via `FFMPEG#ffmpeg_binary=()`.
26
- * Removed Bundler version requirement from gemspec to support all versions.
27
- * Implement `#discard` (alias `#delete`) to discard the video file. Useful when your test passes and you want to get rid of the video file.
28
-
29
- ### 1.0.0.beta8 (2019-01-03)
30
-
31
- * Fix a bug where the gem was incorrectly configured to be required as `ffmpeg/screenrecorder` instead of `ffmpeg-screenrecorder`.
32
- * `ScreenRecorder#start` now returns the IO process object in case the user has a use case for it.
33
- * `RecordingRegion#fetch` now logs a warning that `x11grab` for Linux does not supporting window recording.
34
- * :warning: Parameter `infile` is now `input` to make it more intuitive.
35
-
36
- ### 1.0.0.beta7 (2018-12-23)
37
-
38
- * Fix bug in RecorderOptions where an incorrect object was referenced to read the user provided options.
39
-
40
- ### 1.0.0.beta6 (2018-12-3)
41
-
42
- * Stopping the screenrecorder now prints the failure reason given by the ffmpeg binary when `#stop` fails (Issue #7).
43
- * Log file is now defaulted to `ffmpeg.log` instead of redirecting to nul.
44
- * `log_level` now defaults to `Logger::ERROR` instead of `Logger::INFO`.
45
-
46
- ### 1.0.0.beta5 (2018-11-26)
47
-
48
- * `Screenrecorder` class is now `ScreenRecorder`.
49
- * Add support for Linux.
50
- * Now an exception raised if the gem fails to find `ffmpeg`.
51
- * Fix a bug where a file named `nul` was created instead of directing the output to `NUL`.
1
+ ### 1.0.0.beta11 (2019-03-11)
2
+ * Recording FPS (`framerate`) is defaulted to 15.0.
3
+ * Gem will soo be renamed to `screen_recorder`. Please refer to Issue
4
+ [#45](https://github.com/kapoorlakshya/ffmpeg-screenrecorder/issues/45)
5
+ for more information.
6
+
7
+ ### 1.0.0.beta10 (2019-02-05)
8
+ * Fixed an edge case in Microsoft Windows specific implementation of
9
+ `WindowTitles#fetch` where processes with mismatching names and window
10
+ titles, such as process `"Calculator.exe"` with window title `"CicMarshalWnd"`,
11
+ were omitted ([#35](https://github.com/kapoorlakshya/ffmpeg-screenrecorder/issues/35)).
12
+ This fix also prints a warning when this mismatch occurs.
13
+ * Fixed bug in Linux specific `WindowTitles#fetch` implementation where
14
+ the filter by application name logic was removed. This filter is required
15
+ on Linux here because `wmctrl` returns all open window titles unlike
16
+ Microsoft Windows where `taskmgr` allows us get window titles by process
17
+ name.
18
+ * On Linux, you are now required to provide the `input` as `"desktop"`
19
+ or a display number, such as `":0.0"`. Run `echo $DISPLAY` to check your display number.
20
+ * QOL improvements - Type checking of inputs, spec cleanup, added more
21
+ tests, and fixed rubocop warnings.
22
+
23
+ ### 1.0.0.beta9 (2019-01-22)
24
+
25
+ * :warning: `FFMPEG::RecordingRegions` is now `FFMPEG::WindowTitles`, so the module name is true to the function it provides.
26
+ * Added support for for a user given path via `FFMPEG#ffmpeg_binary=()`.
27
+ * Removed Bundler version requirement from gemspec to support all versions.
28
+ * Implement `#discard` (alias `#delete`) to discard the video file. Useful when your test passes and you want to get rid of the video file.
29
+
30
+ ### 1.0.0.beta8 (2019-01-03)
31
+
32
+ * Fix a bug where the gem was incorrectly configured to be required as `ffmpeg/screenrecorder` instead of `ffmpeg-screenrecorder`.
33
+ * `ScreenRecorder#start` now returns the IO process object in case the user has a use case for it.
34
+ * `RecordingRegion#fetch` now logs a warning that `x11grab` for Linux does not supporting window recording.
35
+ * :warning: Parameter `infile` is now `input` to make it more intuitive.
36
+
37
+ ### 1.0.0.beta7 (2018-12-23)
38
+
39
+ * Fix bug in RecorderOptions where an incorrect object was referenced to read the user provided options.
40
+
41
+ ### 1.0.0.beta6 (2018-12-3)
42
+
43
+ * Stopping the screenrecorder now prints the failure reason given by the ffmpeg binary when `#stop` fails (Issue #7).
44
+ * Log file is now defaulted to `ffmpeg.log` instead of redirecting to nul.
45
+ * `log_level` now defaults to `Logger::ERROR` instead of `Logger::INFO`.
46
+
47
+ ### 1.0.0.beta5 (2018-11-26)
48
+
49
+ * `Screenrecorder` class is now `ScreenRecorder`.
50
+ * Add support for Linux.
51
+ * Now an exception raised if the gem fails to find `ffmpeg`.
52
+ * Fix a bug where a file named `nul` was created instead of directing the output to `NUL`.
52
53
  * Fix a bug where `RecordingRegions#window_titles` was not returning anything because of missing return keyword.
data/README.md CHANGED
@@ -1,180 +1,182 @@
1
- # FFMPEG::ScreenRecorder
2
-
3
- [![Gem Version](https://badge.fury.io/rb/ffmpeg-screenrecorder.svg)](https://badge.fury.io/rb/ffmpeg-screenrecorder)
4
- ![https://rubygems.org/gems/ffmpeg-screenrecorder](https://ruby-gem-downloads-badge.herokuapp.com/ffmpeg-screenrecorder?type=total)
5
- [![Yard Docs](http://img.shields.io/badge/yard-docs-blue.svg)](https://www.rubydoc.info/github/kapoorlakshya/ffmpeg-screenrecorder/master)
6
- [![Maintainability](https://api.codeclimate.com/v1/badges/a176dc755e06a23e5db8/maintainability)](https://codeclimate.com/github/kapoorlakshya/ffmpeg-screenrecorder/maintainability)
7
-
8
- Ruby gem to record your computer screen - desktop or specific application/window - using [FFmpeg](https://www.ffmpeg.org/).
9
-
10
- ## Compatibility
11
-
12
- Supports Windows and Linux as of version `1.0.0-beta5`. macOS support will be added before the final release of `v1.0.0`.
13
-
14
- ## Installation
15
-
16
- #### 1. Setup FFmpeg
17
-
18
- | OS | Download |
19
- |-------------------|--------------------------------------------------------------------------------|
20
- | Microsoft Windows | [ffmpeg.org#build-windows](https://www.ffmpeg.org/download.html#build-windows) or [libx264 enabled build](https://ffmpeg.zeranoe.com/builds/) |
21
- | Linux | [ffmpeg.org#build-linux](https://ffmpeg.org/download.html#build-linux) |
22
- | macOS | [ffmpeg.org#build-mac](https://www.ffmpeg.org/download.html#build-mac) |
23
-
24
- Add location of the `ffmpeg/bin` folder to `PATH` environment variable if using Microsoft Windows ([instructions](https://windowsloop.com/install-ffmpeg-windows-10/)).
25
- Alternatively, you can define the location using `FFMPEG.ffmpeg_binary='/path/to/binary'` in your project.
26
-
27
- #### 2. Install gem
28
-
29
- Next, add this line to your application's Gemfile:
30
-
31
- ```ruby
32
- gem 'ffmpeg-screenrecorder'
33
- ```
34
-
35
- And then execute:
36
-
37
- ```bash
38
- $ bundle
39
- ```
40
-
41
- Or install it yourself as:
42
-
43
- ```bash
44
- $ gem install ffmpeg-screenrecorder --pre
45
- ```
46
-
47
- #### 3. Require gem
48
-
49
- Require this gem in your project and start using the gem:
50
-
51
- ```ruby
52
- require 'ffmpeg-screenrecorder'
53
- ```
54
-
55
- ##### Record Desktop
56
-
57
- ```ruby
58
- opts = { input: 'desktop',
59
- output: 'recording.mp4',
60
- framerate: 15.0 }
61
- @recorder = FFMPEG::ScreenRecorder.new(opts)
62
- @recorder.start
63
-
64
- # ... Run tests or whatever you want to record
65
-
66
- @recorder.stop
67
-
68
- # Recorded file metadata
69
- @recorder.video
70
- #=> #<FFMPEG::Movie:0x00000000067e0a08
71
- @path="screenrecorder-desktop.mp4",
72
- @container="mov,mp4,m4a,3gp,3g2,mj2",
73
- @duration=5.0,
74
- @time=0.0,
75
- @creation_time=nil,
76
- @bitrate=1051,
77
- @rotation=nil,
78
- @video_stream="h264 (High 4:4:4 Predictive) (avc1 / 0x31637661), yuv444p, 2560x1440, 1048 kb/s, 15 fps, 15 tbr, 15360 tbn, 30 tbc (default)",
79
- @audio_stream=nil,
80
- @video_codec="h264 (High 4:4:4 Predictive) (avc1 / 0x31637661)", @colorspace="yuv444p",
81
- @video_bitrate=1048,
82
- @resolution="2560x1440">
83
- ```
84
-
85
- ##### Record Application Window
86
-
87
- ```ruby
88
- require 'watir'
89
-
90
- browser = Watir::Browser.new :firefox
91
-
92
- FFMPEG::WindowTitles.fetch('firefox') # Name of exe
93
- #=> ["Mozilla Firefox"]
94
-
95
- opts = { input: FFMPEG::WindowTitles.fetch('firefox').first,
96
- output: 'recording.mp4',
97
- framerate: 15.0 }
98
- @recorder = FFMPEG::ScreenRecorder.new(opts)
99
- @recorder.start
100
-
101
- # Run tests or whatever you want to record
102
-
103
- @recorder.stop
104
- browser.quit
105
- ```
106
-
107
- <b>Limitations</b>:
108
- - Only works on Microsoft Windows (gdigrab).
109
- - `#fetch` only returns titles from currently active (visible) windows.
110
- - `#fetch` may return `ArgumentError (invalid byte sequence in UTF-8)`
111
- for a window title with non `UTF-8` characters.
112
- See [#38](https://github.com/kapoorlakshya/ffmpeg-screenrecorder/issues/38)
113
- for workaround.
114
- - Always stop the recording before closing the application. Otherwise,
115
- ffmpeg will force exit as soon as the window disappears and may produce
116
- an invalid video file.
117
- - If you're launching multiple applications or testing an application
118
- at different window sizes, recording the `desktop` is a better option.
119
-
120
- #### Options
121
-
122
- - `:input` - `'desktop'` or application window name
123
- - `:output` - Output file location/name
124
- - `:framerate` - Capture FPS
125
- - `:log` - Defaults to `ffmpeg.log`
126
- - `:log_level` for this gem. Default: ERROR
127
-
128
- All other FFmpeg options can be passed through the `advanced` key. This feature is yet to be fully tested, so please feel free to report any bugs or request a feature.
129
-
130
- ```ruby
131
- opts = { input: 'desktop',
132
- output: 'recorder-test.mp4',
133
- framerate: 15,
134
- log: 'recorder.log',
135
- log_level: Logger::DEBUG, # For gem
136
- advanced: { loglevel: 'level+debug', # For FFmpeg
137
- video_size: '640x480',
138
- show_region: '1' }
139
- }
140
-
141
- #
142
- # Command to FFmpeg:
143
- #
144
- # ffmpeg -y -f gdigrab -r 15 -loglevel level+debug -video_size 640x480
145
- # -show_region 1 -i desktop recorder-test.mp4 2> recorder.log
146
- ```
147
-
148
- ## Demo
149
-
150
- You can find example video recordings [here](https://kapoorlakshya.github.io/introducing-ffmpeg-screenrecorder).
151
- Cucumber + Watir based example is [here](https://github.com/kapoorlakshya/cucumber-watir-test-recorder-example).
152
-
153
- ## Development
154
-
155
- After checking out the repo, run `bin/setup` to install dependencies. Then, run `bundle exec rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
156
-
157
- To install this gem onto your local machine, run `bundle exec rake install`.
158
-
159
- ## Contributing
160
-
161
- Bug reports and pull requests are welcome.
162
-
163
- - Please update the specs for your code changes and run them locally with `bundle exec rake spec`.
164
- - Follow the Ruby style guide and format your code - https://github.com/rubocop-hq/ruby-style-guide
165
-
166
- ## License
167
-
168
- The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
169
-
170
- ## Credits
171
-
172
- [![Streamio](http://d253c4ja9jigvu.cloudfront.net/assets/small-logo.png)](http://streamio.com)
173
-
174
- This gem is based on the [streamio-ffmpeg](https://github.com/streamio/streamio-ffmpeg) gem.
175
- <br />
176
- <br />
177
-
178
- ![SauceLabs Logo](https://saucelabs.com/content/images/logo.png)
179
-
1
+ # FFMPEG::ScreenRecorder
2
+
3
+ [![Gem Version](https://badge.fury.io/rb/ffmpeg-screenrecorder.svg)](https://badge.fury.io/rb/ffmpeg-screenrecorder)
4
+ ![https://rubygems.org/gems/ffmpeg-screenrecorder](https://ruby-gem-downloads-badge.herokuapp.com/ffmpeg-screenrecorder?type=total)
5
+ [![Yard Docs](http://img.shields.io/badge/yard-docs-blue.svg)](https://www.rubydoc.info/github/kapoorlakshya/ffmpeg-screenrecorder/master)
6
+ [![Build Status](https://travis-ci.org/kapoorlakshya/ffmpeg-screenrecorder.svg?branch=master)](https://travis-ci.org/kapoorlakshya/ffmpeg-screenrecorder)
7
+ [![Maintainability](https://api.codeclimate.com/v1/badges/a176dc755e06a23e5db8/maintainability)](https://codeclimate.com/github/kapoorlakshya/ffmpeg-screenrecorder/maintainability)
8
+
9
+ Ruby gem to record your computer screen - desktop or specific
10
+ application/window - using [FFmpeg](https://www.ffmpeg.org/). Primarily
11
+ geared towards recording automated UI test executions for easy
12
+ debugging and documentation.
13
+
14
+ ## Compatibility
15
+
16
+ Supports Windows and Linux as of version `1.0.0-beta5`. macOS support will be added before the final release of `v1.0.0`.
17
+
18
+ ## Installation
19
+
20
+ #### 1. Setup FFmpeg
21
+
22
+ | OS | Download |
23
+ |-------------------|--------------------------------------------------------------------------------|
24
+ | Microsoft Windows | [ffmpeg.org#build-windows](https://www.ffmpeg.org/download.html#build-windows) or [libx264 enabled build](https://ffmpeg.zeranoe.com/builds/) |
25
+ | Linux | [ffmpeg.org#build-linux](https://ffmpeg.org/download.html#build-linux) |
26
+ | macOS | [ffmpeg.org#build-mac](https://www.ffmpeg.org/download.html#build-mac) |
27
+
28
+ Add location of the `ffmpeg/bin` folder to `PATH` environment variable if using Microsoft Windows ([instructions](https://windowsloop.com/install-ffmpeg-windows-10/)).
29
+ Alternatively, you can define the location using `FFMPEG.ffmpeg_binary='/path/to/binary'` in your project.
30
+
31
+ #### 2. Install gem
32
+
33
+ Next, add this line to your application's Gemfile:
34
+
35
+ ```ruby
36
+ gem 'ffmpeg-screenrecorder'
37
+ ```
38
+
39
+ And then execute:
40
+
41
+ ```bash
42
+ $ bundle
43
+ ```
44
+
45
+ Or install it yourself as:
46
+
47
+ ```bash
48
+ $ gem install ffmpeg-screenrecorder --pre
49
+ ```
50
+
51
+ #### 3. Require gem
52
+
53
+ Require this gem in your project and start using the gem:
54
+
55
+ ```ruby
56
+ require 'ffmpeg-screenrecorder'
57
+ ```
58
+
59
+ ## Record Desktop
60
+
61
+ ```ruby
62
+ opts = { input: 'desktop',
63
+ output: 'recording.mp4' }
64
+ @recorder = FFMPEG::ScreenRecorder.new(opts)
65
+ @recorder.start
66
+
67
+ # ... Run tests or whatever you want to record
68
+
69
+ @recorder.stop
70
+
71
+ # Recorded file metadata
72
+ @recorder.video
73
+ #=> #<FFMPEG::Movie:0x00000000067e0a08
74
+ @path="recording.mp4",
75
+ @container="mov,mp4,m4a,3gp,3g2,mj2",
76
+ @duration=5.0,
77
+ @time=0.0,
78
+ @creation_time=nil,
79
+ @bitrate=1051,
80
+ @rotation=nil,
81
+ @video_stream="h264 (High 4:4:4 Predictive) (avc1 / 0x31637661), yuv444p, 2560x1440, 1048 kb/s, 15 fps, 15 tbr, 15360 tbn, 30 tbc (default)",
82
+ @audio_stream=nil,
83
+ @video_codec="h264 (High 4:4:4 Predictive) (avc1 / 0x31637661)", @colorspace="yuv444p",
84
+ @video_bitrate=1048,
85
+ @resolution="2560x1440">
86
+ ```
87
+
88
+ ## Record Application Window
89
+
90
+ ```ruby
91
+ require 'watir'
92
+
93
+ browser = Watir::Browser.new :firefox
94
+
95
+ FFMPEG::WindowTitles.fetch('firefox') # Name of exe
96
+ #=> ["Mozilla Firefox"]
97
+
98
+ opts = { input: FFMPEG::WindowTitles.fetch('firefox').first,
99
+ output: 'recording.mp4' }
100
+ @recorder = FFMPEG::ScreenRecorder.new(opts)
101
+ @recorder.start
102
+
103
+ # Run tests or whatever you want to record
104
+
105
+ @recorder.stop
106
+ browser.quit
107
+ ```
108
+
109
+ <b>Limitations</b>
110
+ - Only works on Microsoft Windows (gdigrab).
111
+ - `#fetch` only returns titles from currently active (visible) windows.
112
+ - `#fetch` may return `ArgumentError (invalid byte sequence in UTF-8)`
113
+ for a window title with non `UTF-8` characters.
114
+ See [#38](https://github.com/kapoorlakshya/ffmpeg-screenrecorder/issues/38)
115
+ for workaround.
116
+ - Always stop the recording before closing the application. Otherwise,
117
+ ffmpeg will force exit as soon as the window disappears and may produce
118
+ an invalid video file.
119
+ - If you're launching multiple applications or testing an application
120
+ at different window sizes, recording the `desktop` is a better option.
121
+
122
+ ## Options
123
+
124
+ - `:input` - `'desktop'` or application window name
125
+ - `:output` - Output file location/name
126
+ - `:framerate` - Capture FPS
127
+ - `:log` - Defaults to `ffmpeg.log`
128
+ - `:log_level` for this gem. Default: ERROR
129
+
130
+ All other FFmpeg options can be passed through the `advanced` key. This feature is yet to be fully tested, so please feel free to report any bugs or request a feature.
131
+
132
+ ```ruby
133
+ opts = { input: 'desktop',
134
+ output: 'recorder-test.mp4',
135
+ framerate: 30.0,
136
+ log: 'recorder.log',
137
+ log_level: Logger::DEBUG, # For gem
138
+ advanced: { loglevel: 'level+debug', # For FFmpeg
139
+ video_size: '640x480',
140
+ show_region: '1' }
141
+ }
142
+
143
+ #
144
+ # Command to FFmpeg:
145
+ #
146
+ # ffmpeg -y -f gdigrab -r 15 -loglevel level+debug -video_size 640x480
147
+ # -show_region 1 -i desktop recorder-test.mp4 2> recorder.log
148
+ ```
149
+
150
+ ## Demo
151
+
152
+ You can find example video recordings [here](https://kapoorlakshya.github.io/introducing-ffmpeg-screenrecorder).
153
+ Cucumber + Watir based example is [here](https://github.com/kapoorlakshya/cucumber-watir-test-recorder-example).
154
+
155
+ ## Development
156
+
157
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `bundle exec rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
158
+
159
+ To install this gem onto your local machine, run `bundle exec rake install`.
160
+
161
+ ## Contributing
162
+
163
+ Bug reports and pull requests are welcome.
164
+
165
+ - Please update the specs for your code changes and run them locally with `bundle exec rake spec`.
166
+ - Follow the Ruby style guide and format your code - https://github.com/rubocop-hq/ruby-style-guide
167
+
168
+ ## License
169
+
170
+ The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
171
+
172
+ ## Credits
173
+
174
+ [![Streamio](http://d253c4ja9jigvu.cloudfront.net/assets/small-logo.png)](http://streamio.com)
175
+
176
+ This gem is based on the [streamio-ffmpeg](https://github.com/streamio/streamio-ffmpeg) gem.
177
+ <br />
178
+ <br />
179
+
180
+ ![SauceLabs Logo](https://saucelabs.com/content/images/logo.png)
181
+
180
182
  Thanks to [SauceLabs](https://saucelabs.com) for providing me with a free account. If you manage an open source project, you can apply for a free account [here](https://saucelabs.com/open-source).
@@ -21,9 +21,14 @@ Gem::Specification.new do |spec|
21
21
  spec.add_development_dependency 'pry-byebug', '~> 3.6'
22
22
  spec.add_development_dependency 'rake', '~> 10.0'
23
23
  spec.add_development_dependency 'rspec', '~> 3.0'
24
+ spec.add_development_dependency 'rubocop', '~> 0.59'
24
25
  spec.add_development_dependency 'watir', '~> 6.0'
25
26
  spec.add_development_dependency 'webdrivers', '~> 3.0'
26
27
 
27
28
  spec.add_runtime_dependency 'os', '~> 0.9.0'
28
29
  spec.add_runtime_dependency 'streamio-ffmpeg', '~> 1.0'
30
+
31
+ spec.post_install_message = 'PLEASE NOTE: ffmpeg-screenrecorder will soon be renamed to screen_recorder. ' \
32
+ 'Please refer to Issue #45 on GitHub for more information ' \
33
+ '(https://github.com/kapoorlakshya/ffmpeg-screenrecorder/issues/45). Thank you!'
29
34
  end
@@ -1,3 +1,3 @@
1
- require 'streamio-ffmpeg'
2
- require 'os'
1
+ require 'streamio-ffmpeg'
2
+ require 'os'
3
3
  require 'ffmpeg/screenrecorder'
@@ -2,6 +2,7 @@ module FFMPEG
2
2
  # @since 1.0.0-beta2
3
3
  class RecorderOptions
4
4
  DEFAULT_LOG_FILE = 'ffmpeg.log'.freeze
5
+ DEFAULT_FPS = 15.0
5
6
 
6
7
  def initialize(options)
7
8
  TypeChecker.check options, Hash
@@ -13,14 +14,14 @@ module FFMPEG
13
14
  # Returns given recording format
14
15
  #
15
16
  def format
16
- determine_format
17
+ determine_capture_device
17
18
  end
18
19
 
19
20
  #
20
21
  # Returns given framerate
21
22
  #
22
23
  def framerate
23
- @options[:framerate]
24
+ @options[:framerate] || DEFAULT_FPS
24
25
  end
25
26
 
26
27
  #
@@ -70,7 +71,7 @@ module FFMPEG
70
71
  # ready for the ffmpeg process to use
71
72
  #
72
73
  def parsed
73
- vals = "-f #{determine_format} "
74
+ vals = "-f #{determine_capture_device} "
74
75
  vals << "-r #{@options[:framerate]} "
75
76
  vals << advanced_options if @options[:advanced]
76
77
  vals << "-i #{determine_input} "
@@ -97,7 +98,7 @@ module FFMPEG
97
98
  # Returns Array of required options sa Symbols
98
99
  #
99
100
  def required_options
100
- %i[framerate input output]
101
+ %i[input output]
101
102
  end
102
103
 
103
104
  #
@@ -143,9 +144,9 @@ module FFMPEG
143
144
  end
144
145
 
145
146
  #
146
- # Returns format based on the current OS.
147
+ # Returns capture device based on user given value or the current OS.
147
148
  #
148
- def determine_format
149
+ def determine_capture_device
149
150
  return @options[:format] if @options[:format]
150
151
 
151
152
  if OS.windows?
@@ -1,5 +1,5 @@
1
1
  module FFMPEG
2
2
  class ScreenRecorder
3
- VERSION = '1.0.0.beta10'.freeze
3
+ VERSION = '1.0.0.beta11'.freeze
4
4
  end
5
5
  end
@@ -1,78 +1,82 @@
1
- module FFMPEG
2
- # @since 1.0.0-beta4
3
- module WindowTitles
4
- IGNORED_WINDOW_TITLES = %r{^Window Title:( N/A|\s+)?} # From Chrome extensions
5
-
6
- #
7
- # Returns a list of available window titles for the given application (process) name.
8
- #
9
- def self.fetch(application)
10
- FFMPEG.logger.debug "Retrieving available windows for: #{application}"
11
- WindowGrabber.new.available_windows_for application
12
- end
13
-
14
- # @since 1.0.0-beta4
15
- class WindowGrabber
16
- #
17
- # Returns a cleaned up list of available window titles
18
- # for the given application (process) name.
19
- #
20
- def available_windows_for(application)
21
- return windows_os_window(application) if OS.windows?
22
- return linux_os_window(application) if OS.linux?
23
-
24
- raise NotImplementedError, 'Your OS is not supported.'
25
- end
26
-
27
- private
28
-
29
- #
30
- # Returns list of window titles in FFmpeg expected format when using Microsoft Windows
31
- #
32
- def windows_os_window(application)
33
- titles = `tasklist /v /fi "imagename eq #{application}.exe" /fo list | findstr Window`
34
- .split("\n")
35
- .map { |i| i.gsub(IGNORED_WINDOW_TITLES, '') }
36
- .reject(&:empty?)
37
- raise RecorderErrors::ApplicationNotFound, "No open windows found for: #{application}.exe" if titles.empty?
38
-
39
- warn_on_mismatch(titles, application)
40
- titles
41
- end
42
-
43
- #
44
- # Returns list of window titles in FFmpeg expected format when using Linux
45
- #
46
- def linux_os_window(application)
47
- FFMPEG.logger.warn 'Default capture device on Linux (x11grab) does not support window recording.'
48
- raise DependencyNotFound, 'wmctrl is not installed. Run: sudo apt install wmctrl.' unless wmctrl_installed?
49
-
50
- titles = `wmctrl -l | awk '{$3=""; $2=""; $1=""; print $0}'` # Returns all open windows
51
- .split("\n")
52
- .map(&:strip)
53
- .select { |t| t.match?(/#{application}/i) } # Narrow down to given application
54
- raise RecorderErrors::ApplicationNotFound, "No open windows found for: #{application}" if titles.empty?
55
-
56
- titles
57
- end
58
-
59
- #
60
- # Returns true if wmctrl is installed
61
- #
62
- def wmctrl_installed?
63
- !`which wmctrl`.empty? # "" when not found
64
- end
65
-
66
- #
67
- # Prints a warning if the retrieved list of window titles does no include
68
- # the given application process name, which applications commonly do.
69
- #
70
- def warn_on_mismatch(titles, application)
71
- unless titles.map(&:downcase).join(',').include? application.to_s
72
- FFMPEG.logger.warn "Process name and window title(s) do not match: #{titles}"
73
- FFMPEG.logger.warn "Please manually provide the displayed window title."
74
- end
75
- end
76
- end # class WindowGrabber
77
- end # module Windows
1
+ module FFMPEG
2
+ # @since 1.0.0-beta4
3
+ module WindowTitles
4
+ # Regex to filter out "Window Title: N/A" from Chrome extensions and "Window Title: ".
5
+ # This is done to remove unusable titles and to match the Ffmpeg expected input format
6
+ # for capturing specific windows.
7
+ # For example, "Window Title: Google - Mozilla Firefox" becomes "Google - Mozilla Firefox".
8
+ FILTERED_TITLES = %r{^Window Title:( N/A|\s+)?}
9
+
10
+ #
11
+ # Returns a list of available window titles for the given application (process) name.
12
+ #
13
+ def self.fetch(application)
14
+ FFMPEG.logger.debug "Retrieving available windows for: #{application}"
15
+ WindowGrabber.new.available_windows_for application
16
+ end
17
+
18
+ # @since 1.0.0-beta4
19
+ class WindowGrabber
20
+ #
21
+ # Returns a cleaned up list of available window titles
22
+ # for the given application (process) name.
23
+ #
24
+ def available_windows_for(application)
25
+ return windows_os_window(application) if OS.windows?
26
+ return linux_os_window(application) if OS.linux?
27
+
28
+ raise NotImplementedError, 'Your OS is not supported.'
29
+ end
30
+
31
+ private
32
+
33
+ #
34
+ # Returns list of window titles in FFmpeg expected format when using Microsoft Windows
35
+ #
36
+ def windows_os_window(application)
37
+ titles = `tasklist /v /fi "imagename eq #{application}.exe" /fo list | findstr Window`
38
+ .split("\n")
39
+ .map { |i| i.gsub(FILTERED_TITLES, '') }
40
+ .reject(&:empty?)
41
+ raise RecorderErrors::ApplicationNotFound, "No open windows found for: #{application}.exe" if titles.empty?
42
+
43
+ warn_on_mismatch(titles, application)
44
+ titles
45
+ end
46
+
47
+ #
48
+ # Returns list of window titles in FFmpeg expected format when using Linux
49
+ #
50
+ def linux_os_window(application)
51
+ FFMPEG.logger.warn 'Default capture device on Linux (x11grab) does not support window recording.'
52
+ raise DependencyNotFound, 'wmctrl is not installed. Run: sudo apt install wmctrl.' unless wmctrl_installed?
53
+
54
+ titles = `wmctrl -l | awk '{$3=""; $2=""; $1=""; print $0}'` # Returns all open windows
55
+ .split("\n")
56
+ .map(&:strip)
57
+ .select { |t| t.match?(/#{application}/i) } # Narrow down to given application
58
+ raise RecorderErrors::ApplicationNotFound, "No open windows found for: #{application}" if titles.empty?
59
+
60
+ titles
61
+ end
62
+
63
+ #
64
+ # Returns true if wmctrl is installed
65
+ #
66
+ def wmctrl_installed?
67
+ !`which wmctrl`.empty? # "" when not found
68
+ end
69
+
70
+ #
71
+ # Prints a warning if the retrieved list of window titles does no include
72
+ # the given application process name, which applications commonly do.
73
+ #
74
+ def warn_on_mismatch(titles, application)
75
+ unless titles.map(&:downcase).join(',').include? application.to_s
76
+ FFMPEG.logger.warn "Process name and window title(s) do not match: #{titles}"
77
+ FFMPEG.logger.warn "Please manually provide the displayed window title."
78
+ end
79
+ end
80
+ end # class WindowGrabber
81
+ end # module Windows
78
82
  end # module FFMPEG
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.beta10
4
+ version: 1.0.0.beta11
5
5
  platform: ruby
6
6
  authors:
7
7
  - Lakshya Kapoor
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-02-05 00:00:00.000000000 Z
11
+ date: 2019-03-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: pry-byebug
@@ -52,6 +52,20 @@ dependencies:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: '3.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rubocop
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '0.59'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '0.59'
55
69
  - !ruby/object:Gem::Dependency
56
70
  name: watir
57
71
  requirement: !ruby/object:Gem::Requirement
@@ -116,6 +130,7 @@ executables: []
116
130
  extensions: []
117
131
  extra_rdoc_files: []
118
132
  files:
133
+ - ".github/ISSUE_TEMPLATE.md"
119
134
  - ".gitignore"
120
135
  - ".rspec"
121
136
  - ".rubocop.yml"
@@ -139,7 +154,9 @@ homepage: http://github.com/kapoorlakshya/ffmpeg-screenrecorder
139
154
  licenses:
140
155
  - MIT
141
156
  metadata: {}
142
- post_install_message:
157
+ post_install_message: 'PLEASE NOTE: ffmpeg-screenrecorder will soon be renamed to
158
+ screen_recorder. Please refer to Issue #45 on GitHub for more information (https://github.com/kapoorlakshya/ffmpeg-screenrecorder/issues/45).
159
+ Thank you!'
143
160
  rdoc_options: []
144
161
  require_paths:
145
162
  - lib