Class: Headless::VideoRecorder
- Inherits:
-
Object
- Object
- Headless::VideoRecorder
- Defined in:
- lib/headless/video/video_recorder.rb
Instance Attribute Summary collapse
-
#ffmpeg_path ⇒ Object
Returns the value of attribute ffmpeg_path.
-
#log_file_path ⇒ Object
Returns the value of attribute log_file_path.
-
#pid_file_path ⇒ Object
Returns the value of attribute pid_file_path.
-
#tmp_file_path ⇒ Object
Returns the value of attribute tmp_file_path.
Instance Method Summary collapse
- #capture_running? ⇒ Boolean
-
#initialize(display, dimensions, options = {}) ⇒ VideoRecorder
constructor
Construct a new Video Recorder instance.
- #start_capture ⇒ Object
- #stop_and_discard ⇒ Object
- #stop_and_save(path) ⇒ Object
Constructor Details
#initialize(display, dimensions, options = {}) ⇒ VideoRecorder
Construct a new Video Recorder instance. Typically done from inside Headless, but can be also created manually, and even used separately from Headless’ Xvfb features.
-
display - display number to capture
-
dimensions - dimensions of the captured video
-
options - available options:
-
ffmpeg_path - override path to ffmpeg binary
-
pid_file_path - override path to PID file, default is placed in /tmp
-
tmp_file_path - override path to temp file, default is placed in /tmp
-
log_file_path - set log file path, default is /dev/null
-
codec - change ffmpeg codec, default is qtrle
-
frame_rate - change frame rate, default is 30
-
devices - array of device options - see www.ffmpeg.org/ffmpeg-devices.html
-
extra - array of extra options to append to the FFMpeg command line
-
20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
# File 'lib/headless/video/video_recorder.rb', line 20 def initialize(display, dimensions, = {}) @display = display @dimensions = dimensions[/.+(?=x)/] @pid_file_path = .fetch(:pid_file_path, "/tmp/.headless_ffmpeg_#{@display}.pid") @tmp_file_path = .fetch(:tmp_file_path, "/tmp/.headless_ffmpeg_#{@display}.mov") @log_file_path = .fetch(:log_file_path, File::NULL) @codec = .fetch(:codec, "qtrle") @frame_rate = .fetch(:frame_rate, 30) # If no ffmpeg_path was specified, use the default @ffmpeg_path = .fetch(:ffmpeg_path, .fetch(:provider_binary_path, "ffmpeg")) @extra = Array(.fetch(:extra, [])) @devices = Array(.fetch(:devices, [])) CliUtil.ensure_application_exists!(ffmpeg_path, "#{ffmpeg_path} not found on your system. " \ "Install it or change video recorder provider") end |
Instance Attribute Details
#ffmpeg_path ⇒ Object
Returns the value of attribute ffmpeg_path.
5 6 7 |
# File 'lib/headless/video/video_recorder.rb', line 5 def ffmpeg_path @ffmpeg_path end |
#log_file_path ⇒ Object
Returns the value of attribute log_file_path.
5 6 7 |
# File 'lib/headless/video/video_recorder.rb', line 5 def log_file_path @log_file_path end |
#pid_file_path ⇒ Object
Returns the value of attribute pid_file_path.
5 6 7 |
# File 'lib/headless/video/video_recorder.rb', line 5 def pid_file_path @pid_file_path end |
#tmp_file_path ⇒ Object
Returns the value of attribute tmp_file_path.
5 6 7 |
# File 'lib/headless/video/video_recorder.rb', line 5 def tmp_file_path @tmp_file_path end |
Instance Method Details
#capture_running? ⇒ Boolean
41 42 43 |
# File 'lib/headless/video/video_recorder.rb', line 41 def capture_running? CliUtil.read_pid @pid_file_path end |
#start_capture ⇒ Object
45 46 47 48 49 50 51 52 53 |
# File 'lib/headless/video/video_recorder.rb', line 45 def start_capture CliUtil.fork_process(command_line_for_capture, @pid_file_path, @log_file_path) at_exit do exit_status = $!.status if $!.is_a?(SystemExit) stop_and_discard exit exit_status if exit_status end end |
#stop_and_discard ⇒ Object
67 68 69 70 71 72 73 74 |
# File 'lib/headless/video/video_recorder.rb', line 67 def stop_and_discard CliUtil.kill_process(@pid_file_path, wait: true) begin FileUtils.rm(@tmp_file_path) rescue Errno::ENOENT # that's ok if the file doesn't exist end end |
#stop_and_save(path) ⇒ Object
55 56 57 58 59 60 61 62 63 64 65 |
# File 'lib/headless/video/video_recorder.rb', line 55 def stop_and_save(path) CliUtil.kill_process(@pid_file_path, wait: true) if File.exist? @tmp_file_path begin FileUtils.mkdir_p(File.dirname(path)) FileUtils.mv(@tmp_file_path, path) rescue Errno::EINVAL nil end end end |