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
参数来纠正
我想流式传输 运行 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
参数来纠正