ffmpeg-screenrecorder 1.0.0.beta8 → 1.0.0.beta9

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: b93c3e8b673ad688449c8af7a13f3b936f6f9c0665d9b265e0a4ffd5d5820018
4
- data.tar.gz: 9fc25d97554efee3a142bbadaf4699220221dacec0e7e6158484593be13f206d
3
+ metadata.gz: 12cfdba9f1cb9d3296d231d3cc1c6262ff6f2350a1bd79db2d66db3e12d06e09
4
+ data.tar.gz: a8be75c4fe64a40eff487fdc9345f612f185f21c1df7f81f31944a07913af72c
5
5
  SHA512:
6
- metadata.gz: fa97bae768e73ad1175005d9e13a51874d443e692c539b3cd329fd6a412f84bb5c00e9bb07c2683b198a79ef7d8876c57be0d71b3e8ee30ebb9141fbd2d42e19
7
- data.tar.gz: 9fa3025ffae72d29381d0342f88fa938e6800374e967d4e741f47df201ec820e5e289ba57a1277eba61b332720c95a8fba8e4a79ce7350c20c6ec80b265b3d94
6
+ metadata.gz: 116ffbcc5f2532a017f5d5fe02d2d44759301ad8955d91e6711fe186941a33064f82fecb03c92f10a12436e6159b0015c8449ddfd2fa439d5aa51b510bc673e2
7
+ data.tar.gz: 57867328f8e57dac849f63ba0be69f45fa365a8e6036c38e0c422b3dc3fd43f74b4a07321267cd7452d3ee460ba66d72f35d60764686fbf47240a7d28366fec9
data/.gitignore CHANGED
@@ -1,104 +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
-
20
- Gemfile.lock
21
-
22
- # rspec failure tracking
23
- .rspec_status
24
-
25
- # User-specific stuff
26
- .idea/
27
- .idea/**/workspace.xml
28
- .idea/**/tasks.xml
29
- .idea/**/usage.statistics.xml
30
- .idea/**/dictionaries
31
- .idea/**/shelf
32
-
33
- # Generated files
34
- .idea/**/contentModel.xml
35
-
36
- # Sensitive or high-churn files
37
- .idea/**/dataSources/
38
- .idea/**/dataSources.ids
39
- .idea/**/dataSources.local.xml
40
- .idea/**/sqlDataSources.xml
41
- .idea/**/dynamic.xml
42
- .idea/**/uiDesigner.xml
43
- .idea/**/dbnavigator.xml
44
-
45
- # Gradle
46
- .idea/**/gradle.xml
47
- .idea/**/libraries
48
-
49
- # Gradle and Maven with auto-import
50
- # When using Gradle or Maven with auto-import, you should exclude module files,
51
- # since they will be recreated, and may cause churn. Uncomment if using
52
- # auto-import.
53
- # .idea/modules.xml
54
- # .idea/*.iml
55
- # .idea/modules
56
-
57
- # CMake
58
- cmake-build-*/
59
-
60
- # Mongo Explorer plugin
61
- .idea/**/mongoSettings.xml
62
-
63
- # File-based project format
64
- *.iws
65
-
66
- # IntelliJ
67
- out/
68
-
69
- # mpeltonen/sbt-idea plugin
70
- .idea_modules/
71
-
72
- # JIRA plugin
73
- atlassian-ide-plugin.xml
74
-
75
- # Cursive Clojure plugin
76
- .idea/replstate.xml
77
-
78
- # Crashlytics plugin (for Android Studio and IntelliJ)
79
- com_crashlytics_export_strings.xml
80
- crashlytics.properties
81
- crashlytics-build.properties
82
- fabric.properties
83
-
84
- # Editor-based Rest Client
85
- .idea/httpRequests
86
-
87
- # Android studio 3.1+ serialized cache file
88
- .idea/caches/build_file_checksums.ser
89
-
90
- ### RubyMine+all Patch ###
91
- # Ignores the whole .idea folder and all .iml files
92
- # See https://github.com/joeblau/gitignore.io/issues/186 and https://github.com/joeblau/gitignore.io/issues/360
93
-
94
- .idea/
95
-
96
- # Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-249601023
97
-
98
- *.iml
99
- modules.xml
100
- .idea/misc.xml
101
- *.ipr
102
-
103
-
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
+
104
108
  # End of https://www.gitignore.io/api/rubymine+all
data/.travis.yml CHANGED
@@ -1,23 +1,24 @@
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
- - echo $DISPLAY
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
data/CHANGES.md CHANGED
@@ -1,24 +1,31 @@
1
- ### 1.0.0.beta8 (2019-01-03)
2
-
3
- * Fix a bug where the gem was incorrectly configured to be required as `ffmpeg/screenrecorder` instead of `ffmpeg-screenrecorder`.
4
- * `ScreenRecorder#start` now returns the IO process object in case the user has a use case for it.
5
- * `RecordingRegion#fetch` now logs a warning that `x11grab` for Linux does not supporting window recording.
6
- * :warning: Parameter `infile` is now `input` to make it more intuitive.
7
- g
8
- ### 1.0.0.beta7 (2018-12-23)
9
-
10
- * Fix bug in RecorderOptions where an incorrect object was referenced to read the user provided options.
11
-
12
- ### 1.0.0.beta6 (2018-12-3)
13
-
14
- * Stopping the screenrecorder now prints the failure reason given by the ffmpeg binary when `#stop` fails (Issue #7).
15
- * Log file is now defaulted to `ffmpeg.log` instead of redirecting to nul.
16
- * `log_level` now defaults to `Logger::ERROR` instead of `Logger::INFO`.
17
-
18
- ### 1.0.0.beta5 (2018-11-26)
19
-
20
- * `Screenrecorder` class is now `ScreenRecorder`.
21
- * Add support for Linux.
22
- * Now an exception raised if the gem fails to find `ffmpeg`.
23
- * Fix a bug where a file named `nul` was created instead of directing the output to `NUL`.
1
+ ### 1.0.0.beta9 (2019-01-22)
2
+
3
+ * :warning: `FFMPEG::RecordingRegions` is now `FFMPEG::WindowTitles`, so the module name is true to the function it provides.
4
+ * Added support for for a user given path via `FFMPEG#ffmpeg_binary=()`.
5
+ * Removed Bundler version requirement from gemspec to support all versions.
6
+ * Implement `#discard` (alias `#delete`) to discard the video file. Useful when your test passes and you want to get rid of the video file.
7
+
8
+ ### 1.0.0.beta8 (2019-01-03)
9
+
10
+ * Fix a bug where the gem was incorrectly configured to be required as `ffmpeg/screenrecorder` instead of `ffmpeg-screenrecorder`.
11
+ * `ScreenRecorder#start` now returns the IO process object in case the user has a use case for it.
12
+ * `RecordingRegion#fetch` now logs a warning that `x11grab` for Linux does not supporting window recording.
13
+ * :warning: Parameter `infile` is now `input` to make it more intuitive.
14
+
15
+ ### 1.0.0.beta7 (2018-12-23)
16
+
17
+ * Fix bug in RecorderOptions where an incorrect object was referenced to read the user provided options.
18
+
19
+ ### 1.0.0.beta6 (2018-12-3)
20
+
21
+ * Stopping the screenrecorder now prints the failure reason given by the ffmpeg binary when `#stop` fails (Issue #7).
22
+ * Log file is now defaulted to `ffmpeg.log` instead of redirecting to nul.
23
+ * `log_level` now defaults to `Logger::ERROR` instead of `Logger::INFO`.
24
+
25
+ ### 1.0.0.beta5 (2018-11-26)
26
+
27
+ * `Screenrecorder` class is now `ScreenRecorder`.
28
+ * Add support for Linux.
29
+ * Now an exception raised if the gem fails to find `ffmpeg`.
30
+ * Fix a bug where a file named `nul` was created instead of directing the output to `NUL`.
24
31
  * Fix a bug where `RecordingRegions#window_titles` was not returning anything because of missing return keyword.
data/README.md CHANGED
@@ -1,156 +1,167 @@
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
-
7
- Ruby gem to record your computer screen - desktop or specific application/window - using [FFmpeg](https://www.ffmpeg.org/).
8
-
9
- ## Compatibility
10
-
11
- Supports Windows and Linux as of version `1.0.0-beta5`. macOS support will be added before the final release of `v1.0.0`.
12
-
13
- ## Installation
14
-
15
- On Microsoft Windows, [download](https://www.ffmpeg.org/download.html#build-windows), extract and add the location of `/bin` to your ENV `PATH` variable.
16
-
17
- For Linux, follow instructions here - https://ffmpeg.org/download.html#build-linux
18
-
19
- Once installed, make sure ffmpeg is found:
20
-
21
- $ ffmpeg -version
22
- ffmpeg version N-92132-g0a41a8bf29 Copyright (c) 2000-2018 the FFmpeg developers
23
- built with gcc 8.2.1 (GCC) 20180813
24
- configuration: --enable-gpl --enable-version3 --enable-sdl2 --enable-fontconfig --enable-g
25
- nutls --enable-iconv --enable-libass --enable-libbluray --enable-libfreetype --enable-libm
26
- p3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable
27
- -libopus --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libtheora --enable
28
- -libtwolame --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable
29
- -libx265 --enable-libxml2 --enable-libzimg --enable-lzma --enable-zlib --enable-gmp --enab
30
- le-libvidstab --enable-libvorbis --enable-libvo-amrwbenc --enable-libmysofa --enable-libsp
31
- eex --enable-libxvid --enable-libaom --enable-libmfx --enable-amf --enable-ffnvcodec --ena
32
- ble-cuvid --enable-d3d11va --enable-nvenc --enable-nvdec --enable-dxva2 --enable-avisynth
33
- libavutil 56. 19.101 / 56. 19.101
34
- libavcodec 58. 32.100 / 58. 32.100
35
- libavformat 58. 18.104 / 58. 18.104
36
- libavdevice 58. 4.105 / 58. 4.105
37
- libavfilter 7. 33.100 / 7. 33.100
38
- libswscale 5. 2.100 / 5. 2.100
39
- libswresample 3. 2.100 / 3. 2.100
40
- libpostproc 55. 2.100 / 55. 2.100
41
-
42
- Next, add this line to your application's Gemfile:
43
-
44
- ```ruby
45
- gem 'ffmpeg-screenrecorder'
46
- ```
47
-
48
- And then execute:
49
-
50
- $ bundle
51
-
52
- Or install it yourself as:
53
-
54
- $ gem install ffmpeg-screenrecorder
55
-
56
- ## Usage
57
-
58
- #### Required Options
59
-
60
- - `:input` - `desktop` or application window name
61
- - `:output` - Output file location/name
62
- - `:framerate` - Capture FPS
63
-
64
- #### Advanced Options
65
-
66
- - `:log` - Defaults to `ffmpeg.log`
67
- - `:log_level` for this gem
68
-
69
- 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.
70
-
71
- <b>Example</b>:
72
-
73
- ```
74
- opts = { input: 'desktop',
75
- output: 'recorder-test.mp4',
76
- framerate: 30,
77
- log: 'recorder.log',
78
- log_level: Logger::DEBUG, # For gem
79
- advanced: { loglevel: 'level+debug' } # For FFmpeg
80
- }
81
- ```
82
-
83
- ##### Record Desktop
84
-
85
- ```
86
- opts = { input: 'desktop',
87
- output: 'screenrecorder-desktop.mp4',
88
- framerate: 30.0 }
89
- @recorder = FFMPEG::ScreenRecorder.new(opts)
90
-
91
- # Start recording
92
- @recorder.start #=> #<IO:fd 5>
93
-
94
- # ... Run tests or whatever you want to record
95
-
96
- # Stop recording
97
- @recorder.stop #=> #<FFMPEG::Movie...>
98
-
99
- # Recorded file
100
- @recorder.video #=> #<FFMPEG::Movie...>
101
- ```
102
-
103
- ##### Record Application Window - Microsoft Windows (`gdigrab`) Only
104
- ```
105
- require 'watir'
106
-
107
- browser = Watir::Browser.new :firefox
108
-
109
- FFMPEG::RecordingRegions.fetch('firefox') # Name of exe
110
- #=> ["Mozilla Firefox"]
111
-
112
- opts = { input: FFMPEG::RecordingRegions.fetch('firefox').first,
113
- output: 'screenrecorder-firefox.mp4',
114
- framerate: 30.0,
115
- log: 'screenrecorder-firefox.log' }
116
- @recorder = FFMPEG::ScreenRecorder.new(opts)
117
-
118
- # Start recording
119
- @recorder.start
120
-
121
- # Run tests or whatever you want to record
122
- browser.goto 'watir.com'
123
- browser.link(text: 'News').wait_until_present.click
124
-
125
- # Stop recording
126
- @recorder.stop
127
-
128
- browser.quit
129
- ```
130
-
131
- <b>Note</b>:
132
- - Always stop the recording before closing the application. Otherwise, ffmpeg will force exit as soon as the window disappears and may produce an invalid video file.
133
- - If you're launching multiple applications or testing an application at different window sizes, recording the `desktop` is a better option.
134
-
135
- ## Development
136
-
137
- 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.
138
-
139
- To install this gem onto your local machine, run `bundle exec rake install`.
140
-
141
- ## Contributing
142
-
143
- Bug reports and pull requests are welcome.
144
-
145
- - Please update the specs for your code changes and run them locally with `bundle exec rake spec`.
146
- - Follow the Ruby style guide and format your code - https://github.com/rubocop-hq/ruby-style-guide
147
-
148
- ## License
149
-
150
- The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
151
-
152
- ## Credits
153
-
154
- ![SauceLabs Logo](https://saucelabs.com/content/images/logo.png)
155
-
156
- Thanks to [SauceLabs](https://saucelabs.com) for providing me with a free account. If you manage an open source project, you can get your free account [here](https://saucelabs.com/open-source).
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
+
7
+ Ruby gem to record your computer screen - desktop or specific application/window - using [FFmpeg](https://www.ffmpeg.org/).
8
+
9
+ ## Compatibility
10
+
11
+ Supports Windows and Linux as of version `1.0.0-beta5`. macOS support will be added before the final release of `v1.0.0`.
12
+
13
+ ## Installation
14
+
15
+ On Microsoft Windows, [download](https://www.ffmpeg.org/download.html#build-windows), extract and add the location of `/bin` to your ENV `PATH` variable. If you want to use `libx264`, download
16
+ [this build](https://ffmpeg.zeranoe.com/builds/) instead.
17
+
18
+ For Linux, follow instructions here - https://ffmpeg.org/download.html#build-linux
19
+
20
+ Once installed, make sure ffmpeg is found:
21
+
22
+ $ ffmpeg -version
23
+ ffmpeg version N-92132-g0a41a8bf29 Copyright (c) 2000-2018 the FFmpeg developers
24
+ built with gcc 8.2.1 (GCC) 20180813
25
+ configuration: --enable-gpl --enable-version3 --enable-sdl2 --enable-fontconfig --enable-g
26
+ nutls --enable-iconv --enable-libass --enable-libbluray --enable-libfreetype --enable-libm
27
+ p3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable
28
+ -libopus --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libtheora --enable
29
+ -libtwolame --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable
30
+ -libx265 --enable-libxml2 --enable-libzimg --enable-lzma --enable-zlib --enable-gmp --enab
31
+ le-libvidstab --enable-libvorbis --enable-libvo-amrwbenc --enable-libmysofa --enable-libsp
32
+ eex --enable-libxvid --enable-libaom --enable-libmfx --enable-amf --enable-ffnvcodec --ena
33
+ ble-cuvid --enable-d3d11va --enable-nvenc --enable-nvdec --enable-dxva2 --enable-avisynth
34
+ libavutil 56. 19.101 / 56. 19.101
35
+ libavcodec 58. 32.100 / 58. 32.100
36
+ libavformat 58. 18.104 / 58. 18.104
37
+ libavdevice 58. 4.105 / 58. 4.105
38
+ libavfilter 7. 33.100 / 7. 33.100
39
+ libswscale 5. 2.100 / 5. 2.100
40
+ libswresample 3. 2.100 / 3. 2.100
41
+ libpostproc 55. 2.100 / 55. 2.100
42
+
43
+ Next, add this line to your application's Gemfile:
44
+
45
+ ```ruby
46
+ gem 'ffmpeg-screenrecorder'
47
+ ```
48
+
49
+ And then execute:
50
+
51
+ $ bundle
52
+
53
+ Or install it yourself as:
54
+
55
+ $ gem install ffmpeg-screenrecorder
56
+
57
+ Require it in your project and start using the gem:
58
+
59
+ require ffmpeg-screenrecorder
60
+
61
+ ## Usage
62
+
63
+ #### Required Options
64
+
65
+ - `:input` - `'desktop'` or application window name
66
+ - `:output` - Output file location/name
67
+ - `:framerate` - Capture FPS
68
+
69
+ #### Advanced Options
70
+
71
+ - `:log` - Defaults to `ffmpeg.log`
72
+ - `:log_level` for this gem
73
+
74
+ 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.
75
+
76
+ ```
77
+ opts = { input: 'desktop',
78
+ output: 'recorder-test.mp4',
79
+ framerate: 15,
80
+ log: 'recorder.log',
81
+ log_level: Logger::DEBUG, # For gem
82
+ advanced: { loglevel: 'level+debug', # For FFmpeg
83
+ video_size: '640x480',
84
+ show_region: '1' }
85
+ }
86
+ ```
87
+
88
+ ##### Record Desktop
89
+
90
+ ```
91
+ opts = { input: 'desktop',
92
+ output: 'screenrecorder-desktop.mp4',
93
+ framerate: 15.0 }
94
+ @recorder = FFMPEG::ScreenRecorder.new(opts)
95
+
96
+ # Start recording
97
+ @recorder.start #=> #<IO:fd 5>
98
+
99
+ # ... Run tests or whatever you want to record
100
+
101
+ # Stop recording
102
+ @recorder.stop #=> #<FFMPEG::Movie...>
103
+
104
+ # Recorded file
105
+ @recorder.video #=> #<FFMPEG::Movie...>
106
+ ```
107
+
108
+ ##### Record Application Window - Microsoft Windows (`gdigrab`) Only
109
+ ```
110
+ require 'watir'
111
+
112
+ browser = Watir::Browser.new :firefox
113
+
114
+ FFMPEG::WindowTitles.fetch('firefox') # Name of exe
115
+ #=> ["Mozilla Firefox"]
116
+
117
+ opts = { input: FFMPEG::WindowTitles.fetch('firefox').first,
118
+ output: 'screenrecorder-firefox.mp4',
119
+ framerate: 15.0,
120
+ log: 'screenrecorder-firefox.log' }
121
+ @recorder = FFMPEG::ScreenRecorder.new(opts)
122
+
123
+ # Start recording
124
+ @recorder.start
125
+
126
+ # Run tests or whatever you want to record
127
+ browser.goto 'watir.com'
128
+ browser.link(text: 'News').wait_until_present.click
129
+
130
+ # Stop recording
131
+ @recorder.stop
132
+
133
+ browser.quit
134
+ ```
135
+
136
+ <b>Note</b>:
137
+ - Always stop the recording before closing the application. Otherwise, ffmpeg will force exit as soon as the window disappears and may produce an invalid video file.
138
+ - If you're launching multiple applications or testing an application at different window sizes, recording the `desktop` is a better option.
139
+
140
+ ## Demo
141
+
142
+ You can find example video recordings here - [https://kapoorlakshya.github.io/introducing-ffmpeg-screenrecorder](https://kapoorlakshya.github.io/introducing-ffmpeg-screenrecorder)
143
+
144
+ Cucumber + Watir based example - [kapoorlakshya/cucumber-watir-test-recorder-example](https://github.com/kapoorlakshya/cucumber-watir-test-recorder-example)
145
+
146
+ ## Development
147
+
148
+ 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.
149
+
150
+ To install this gem onto your local machine, run `bundle exec rake install`.
151
+
152
+ ## Contributing
153
+
154
+ Bug reports and pull requests are welcome.
155
+
156
+ - Please update the specs for your code changes and run them locally with `bundle exec rake spec`.
157
+ - Follow the Ruby style guide and format your code - https://github.com/rubocop-hq/ruby-style-guide
158
+
159
+ ## License
160
+
161
+ The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
162
+
163
+ ## Credits
164
+
165
+ ![SauceLabs Logo](https://saucelabs.com/content/images/logo.png)
166
+
167
+ 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).
@@ -18,7 +18,6 @@ Gem::Specification.new do |spec|
18
18
 
19
19
  spec.require_paths = ['lib']
20
20
 
21
- spec.add_development_dependency 'bundler', '~> 1.16'
22
21
  spec.add_development_dependency 'pry-byebug', '~> 3.6'
23
22
  spec.add_development_dependency 'rake', '~> 10.0'
24
23
  spec.add_development_dependency 'rspec', '~> 3.0'
@@ -4,6 +4,12 @@ module FFMPEG
4
4
  DEFAULT_LOG_FILE = 'ffmpeg.log'.freeze
5
5
 
6
6
  def initialize(options)
7
+ raise ArgumentError, "Expected Hash, given: #{options.class}" unless options.is_a? Hash
8
+
9
+ if options[:advanced]
10
+ raise ArgumentError, "Expected Hash, given: #{options.class}" unless options[:advanced].is_a? Hash
11
+ end
12
+
7
13
  @options = verify_options options
8
14
  end
9
15
 
@@ -64,7 +70,7 @@ module FFMPEG
64
70
  end
65
71
 
66
72
  #
67
- # Returns a String with all options parsed as a String,
73
+ # Returns a String with all options parsed and
68
74
  # ready for the ffmpeg process to use
69
75
  #
70
76
  def parsed
@@ -132,7 +138,7 @@ module FFMPEG
132
138
  #
133
139
  def determine_input
134
140
  # x11grab doesn't support window capture
135
- return ':0.0' if OS.linux?
141
+ return ':99' if OS.linux?
136
142
 
137
143
  return @options[:input] if @options[:input] == 'desktop'
138
144
 
@@ -1,6 +1,7 @@
1
+ require 'fileutils'
1
2
  require_relative 'recorder_errors'
2
3
  require_relative 'recorder_options'
3
- require_relative 'recording_regions'
4
+ require_relative 'window_titles'
4
5
 
5
6
  module FFMPEG
6
7
  # @since 1.0.0-beta
@@ -38,6 +39,17 @@ module FFMPEG
38
39
  @video = Movie.new(options.output)
39
40
  end
40
41
 
42
+ #
43
+ # Discards the recorded file. Useful in automated testing
44
+ # when a test passes and the recorded file is no longer
45
+ # needed.
46
+ #
47
+ def discard
48
+ FileUtils.rm options.output
49
+ end
50
+
51
+ alias_method :delete, :discard
52
+
41
53
  private
42
54
 
43
55
  #
@@ -109,6 +121,11 @@ module FFMPEG
109
121
 
110
122
  return !`where ffmpeg`.empty? if OS.windows?
111
123
 
124
+ # If the user does not use FFMPEG#ffmpeg_binary=() to set the binary path,
125
+ # FFMPEG#ffmpeg_binary returns 'ffmpeg' assuming it must be in ENV. However,
126
+ # if the above two checks fail, it is not in the ENV either.
127
+ return false if FFMPEG.ffmpeg_binary == 'ffmpeg'
128
+
112
129
  true
113
130
  end
114
131
 
@@ -116,7 +133,7 @@ module FFMPEG
116
133
  # Returns lines from the log file
117
134
  #
118
135
  def get_lines_from_log(position = :last, count = 2)
119
- f = File.open(options.log)
136
+ f = File.open(options.log)
120
137
  lines = f.readlines
121
138
  lines = lines.last(count) if position == :last
122
139
  lines = lines.first(count) if position == :first
@@ -1,5 +1,5 @@
1
1
  module FFMPEG
2
2
  class ScreenRecorder
3
- VERSION = '1.0.0.beta8'.freeze
3
+ VERSION = '1.0.0.beta9'.freeze
4
4
  end
5
5
  end
@@ -1,64 +1,64 @@
1
- module FFMPEG
2
- # @since 1.0.0-beta4
3
- module RecordingRegions
4
- #
5
- # Returns a list of available window titles for the given application (process) name.
6
- #
7
- def self.fetch(application)
8
- FFMPEG.logger.debug "Retrieving available windows for: #{application}"
9
- WindowGrabber.new.available_windows_for application
10
- end
11
-
12
- # @since 1.0.0-beta4
13
- class WindowGrabber
14
- #
15
- # Returns a cleaned up list of available window titles
16
- # for the given application (process) name.
17
- #
18
- def available_windows_for(application)
19
- return windows_os_window(application) if OS.windows?
20
- return linux_os_window(application) if OS.linux?
21
-
22
- raise NotImplementedError, 'Your OS is not supported.'
23
- end
24
-
25
- private
26
-
27
- #
28
- # Returns list of windows when using Microsoft Windows
29
- #
30
- def windows_os_window(application)
31
- raw_list = `tasklist /v /fi "imagename eq #{application}.exe" /fo list | findstr Window`
32
- .split("\n")
33
- .reject { |title| title == 'Window Title: N/A' }
34
- final_list = raw_list.map { |i| i.gsub('Window Title: ', '') } # Match ffmpeg expected format
35
- raise RecorderErrors::ApplicationNotFound, "No open windows found for: #{application}.exe" if final_list.empty?
36
-
37
- final_list
38
- end
39
-
40
- #
41
- # Returns list of windows when using Linux
42
- #
43
- def linux_os_window(application)
44
- FFMPEG.logger.warn 'Note: Default capture device x11grab on Linux does not support window recording.'
45
- raise DependencyNotFound, 'wmctrl is not installed. Run: sudo apt-get install wmctrl.' unless wmctrl_installed?
46
-
47
- final_list = `wmctrl -l | awk '{$3=""; $2=""; $1=""; print $0}'` # Returns all open windows
48
- .split("\n")
49
- .map(&:strip)
50
- .select { |t| t.match?(/#{application}/i) } # Narrow down to given application
51
- raise RecorderErrors::ApplicationNotFound, "No open windows found for: #{application}" if final_list.empty?
52
-
53
- final_list
54
- end
55
-
56
- #
57
- # Returns true if wmctrl is installed
58
- #
59
- def wmctrl_installed?
60
- !`which wmctrl`.empty? # "" when not found
61
- end
62
- end
63
- end # module Windows
1
+ module FFMPEG
2
+ # @since 1.0.0-beta4
3
+ module WindowTitles
4
+ #
5
+ # Returns a list of available window titles for the given application (process) name.
6
+ #
7
+ def self.fetch(application)
8
+ FFMPEG.logger.debug "Retrieving available windows for: #{application}"
9
+ WindowGrabber.new.available_windows_for application
10
+ end
11
+
12
+ # @since 1.0.0-beta4
13
+ class WindowGrabber
14
+ #
15
+ # Returns a cleaned up list of available window titles
16
+ # for the given application (process) name.
17
+ #
18
+ def available_windows_for(application)
19
+ return windows_os_window(application) if OS.windows?
20
+ return linux_os_window(application) if OS.linux?
21
+
22
+ raise NotImplementedError, 'Your OS is not supported.'
23
+ end
24
+
25
+ private
26
+
27
+ #
28
+ # Returns list of windows when using Microsoft Windows
29
+ #
30
+ def windows_os_window(application)
31
+ raw_list = `tasklist /v /fi "imagename eq #{application}.exe" /fo list | findstr Window`
32
+ .split("\n")
33
+ .select { |t| t.match?(/#{application}/i) } # Narrow down to given application
34
+ final_list = raw_list.map { |i| i.gsub('Window Title: ', '') } # Match ffmpeg expected format
35
+ raise RecorderErrors::ApplicationNotFound, "No open windows found for: #{application}.exe" if final_list.empty?
36
+
37
+ final_list
38
+ end
39
+
40
+ #
41
+ # Returns list of windows when using Linux
42
+ #
43
+ def linux_os_window(application)
44
+ FFMPEG.logger.warn 'Note: Default capture device x11grab on Linux does not support window recording.'
45
+ raise DependencyNotFound, 'wmctrl is not installed. Run: sudo apt-get install wmctrl.' unless wmctrl_installed?
46
+
47
+ final_list = `wmctrl -l | awk '{$3=""; $2=""; $1=""; print $0}'` # Returns all open windows
48
+ .split("\n")
49
+ .map(&:strip)
50
+ .select { |t| t.match?(/#{application}/i) } # Narrow down to given application
51
+ raise RecorderErrors::ApplicationNotFound, "No open windows found for: #{application}" if final_list.empty?
52
+
53
+ final_list
54
+ end
55
+
56
+ #
57
+ # Returns true if wmctrl is installed
58
+ #
59
+ def wmctrl_installed?
60
+ !`which wmctrl`.empty? # "" when not found
61
+ end
62
+ end
63
+ end # module Windows
64
64
  end # module FFMPEG
@@ -1,3 +1,3 @@
1
- require 'streamio-ffmpeg'
2
- require 'os'
1
+ require 'streamio-ffmpeg'
2
+ require 'os'
3
3
  require 'ffmpeg/screenrecorder'
metadata CHANGED
@@ -1,29 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ffmpeg-screenrecorder
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0.beta8
4
+ version: 1.0.0.beta9
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-01-03 00:00:00.000000000 Z
11
+ date: 2019-01-23 00:00:00.000000000 Z
12
12
  dependencies:
13
- - !ruby/object:Gem::Dependency
14
- name: bundler
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - "~>"
18
- - !ruby/object:Gem::Version
19
- version: '1.16'
20
- type: :development
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - "~>"
25
- - !ruby/object:Gem::Version
26
- version: '1.16'
27
13
  - !ruby/object:Gem::Dependency
28
14
  name: pry-byebug
29
15
  requirement: !ruby/object:Gem::Requirement
@@ -145,9 +131,9 @@ files:
145
131
  - lib/ffmpeg-screenrecorder.rb
146
132
  - lib/ffmpeg/recorder_errors.rb
147
133
  - lib/ffmpeg/recorder_options.rb
148
- - lib/ffmpeg/recording_regions.rb
149
134
  - lib/ffmpeg/screenrecorder.rb
150
135
  - lib/ffmpeg/version.rb
136
+ - lib/ffmpeg/window_titles.rb
151
137
  homepage: http://github.com/kapoorlakshya/ffmpeg-screenrecorder
152
138
  licenses:
153
139
  - MIT
@@ -167,8 +153,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
167
153
  - !ruby/object:Gem::Version
168
154
  version: 1.3.1
169
155
  requirements: []
170
- rubyforge_project:
171
- rubygems_version: 2.7.6
156
+ rubygems_version: 3.0.2
172
157
  signing_key:
173
158
  specification_version: 4
174
159
  summary: Record your computer screen using ffmpeg via Ruby.