Class: Headless::VideoRecorder

Inherits:
Object
  • Object
show all
Defined in:
lib/headless/video/video_recorder.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

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, options = {})
  @display = display
  @dimensions = dimensions[/.+(?=x)/]

  @pid_file_path = options.fetch(:pid_file_path, "/tmp/.headless_ffmpeg_#{@display}.pid")
  @tmp_file_path = options.fetch(:tmp_file_path, "/tmp/.headless_ffmpeg_#{@display}.mov")
  @log_file_path = options.fetch(:log_file_path, File::NULL)
  @codec = options.fetch(:codec, "qtrle")
  @frame_rate = options.fetch(:frame_rate, 30)

  # If no ffmpeg_path was specified, use the default
  @ffmpeg_path = options.fetch(:ffmpeg_path, options.fetch(:provider_binary_path, "ffmpeg"))

  @extra = Array(options.fetch(:extra, []))
  @devices = Array(options.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_pathObject

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_pathObject

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_pathObject

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_pathObject

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

Returns:

  • (Boolean)


41
42
43
# File 'lib/headless/video/video_recorder.rb', line 41

def capture_running?
  CliUtil.read_pid @pid_file_path
end

#start_captureObject



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_discardObject



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