Selenium 的直播视频 scripts/bots

Live stream video of Selenium scripts/bots

我想流式传输 运行 Selenium scripts/bots 的视频片段。我正在使用 capybara with selenium-webdriver and I know I can use headless 来捕捉视频。

我不知道如何流式传输视频,以便我可以在某些 URL 访问它而不消耗磁盘 space。有人做过吗?

这是我用来生成视频文件的测试脚本:

require 'capybara/dsl'
require 'selenium-webdriver'
require 'headless'

Capybara.configure do |c|
  c.javascript_driver = :selenium
  c.default_driver = :selenium
end

Capybara.register_driver :selenium do |app|
  profile = Selenium::WebDriver::Chrome::Profile.new
  profile['general.useragent.override'] = Bot::USER_AGENT
  Capybara::Selenium::Driver.new(app, { 
    browser: :chrome,
    profile: profile,
    args: ['--window-size=1024,768'] 
  })
end

class Bot
  include Capybara::DSL

  USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36'

  def run
    headless = Headless.new
    headless.start
    headless.video.start_capture

    loop do
      visit('http://google.com')
      sleep 1
      visit('http://youtube.com')
      sleep 1
      headless.video.stop_and_save("video-#{Time.now.to_i}.mov")
    end
  end
end

bot = Bot.new
bot.run

我成功了。这是更新后的 Ruby 脚本:

require 'capybara/dsl'
require 'selenium-webdriver'
require 'headless'

Capybara.configure do |c|
  c.javascript_driver = :selenium
  c.default_driver = :selenium
end

Capybara.register_driver :selenium do |app|
  profile = Selenium::WebDriver::Chrome::Profile.new
  profile['general.useragent.override'] = Bot::USER_AGENT
  Capybara::Selenium::Driver.new(app, {
    browser: :chrome,
    profile: profile,
    args: ["--window-size=1024,768"]
  })
end

class Bot
  include Capybara::DSL

  USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36'
  FILE_PATH = File.join(__dir__, 'segment%05d.ts')

  def run
    headless = Headless.new(video: {
      codec: 'libx264',
      frame_rate: 25,
      tmp_file_path: FILE_PATH,
      extra: [
        '-pix_fmt yuv420p',
        '-profile:v baseline',
        '-b:v 1500k',
        '-x264opts keyint=25',
        '-s 640x360',
        '-map 0',
        '-flags',
        '-global_header',
        '-f segment',
        '-segment_list index_1500.m3u8',
        '-segment_time 1',
        '-segment_format mpeg_ts',
        '-segment_list_type m3u8',
        '-segment_list_flags +live',
        '-segment_list_size 2',
      ],
    })
    headless.start
    headless.video.start_capture

    loop do
      print 'loading google... '
      visit('http://google.com')
      puts 'done'
      print 'loading youtube... '
      visit('http://youtube.com')
      puts 'done'
    end
  end
end

bot = Bot.new
bot.run

在内部,headless 将构建此命令:

/usr/bin/avconv -y -r 25 -s 1280x1024 -f x11grab -i :99 -g 600 -vcodec libx264 -pix_fmt yuv420p -profile:v baseline -b:v 1500k -x264opts keyint=25 -s 640x360
 -map 0 -flags -global_header -f segment -segment_list index_1500.m3u8 -segment_time 1 -segment_format mpeg_ts -segment_list_type m3u8 -segment_list_flags +li
ve -segment_list_size 2 /home/mhluska/record-test/segment%05d.ts

我对ffmpeg不是很了解,所以我无法解释其中一半参数的作用。最终结果是它将生成 segment*.ts 个文件和 index_1500.m3u8 个文件,这似乎是一个清单。

我们现在可以在浏览器中播放了。创建 index.html:

<!doctype html>
<html>
  <head>
    <title>Video stream test</title>
  </head>
  <body>
    <video src="index_1500.m3u8" autoplay controls type="application/x-mpegURL"></video>
  </body>
</html>

并暂时用 sudo python -m SimpleHTTPServer 80 提供。

Notes/caveats:

  • 我必须先在我的 VPS 上设置一个 swap file 否则脚本会被杀死
  • video 标签似乎只能在 Safari 上播放而不是 Chrome
  • 视频 ratio/size 似乎有误,但这可以通过调整 ffmpeg 参数来纠正