From 4b25081c1a55df5df3da4eb3992f2df9d337cc29 Mon Sep 17 00:00:00 2001 From: Onur Erdogan Date: Sat, 2 Sep 2017 02:21:27 +0300 Subject: [PATCH 1/5] Dynamic video rate --- lib/flick/video.rb | 53 ++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 51 insertions(+), 2 deletions(-) diff --git a/lib/flick/video.rb b/lib/flick/video.rb index 088a791..3a46f93 100644 --- a/lib/flick/video.rb +++ b/lib/flick/video.rb @@ -114,7 +114,8 @@ def start_screenshot_record loop do if count.to_i <= image_count driver.screenshot "screenshot-#{udid}-#{count}" - count.next!; sleep seconds + count.next! + # sleep seconds else stop_screenshot_recording break @@ -143,7 +144,34 @@ def mp4 def convert_images_to_mp4 remove_zero_byte_images - %x(ffmpeg -loglevel quiet -framerate 1 -pattern_type glob -i '#{driver.flick_dir}/screenshot-#{udid}*.png' -c:v libx264 -pix_fmt yuv420p #{driver.flick_dir}/#{driver.name}.mp4) + # %x(ffmpeg -loglevel quiet -framerate 1 -pattern_type glob -i '#{driver.flick_dir}/screenshot-#{udid}*.png' -c:v libx264 -pix_fmt yuv420p #{driver.flick_dir}/#{driver.name}.mp4) + + create_timecode_file + + #MP4 Creation for constant framerate + puts "ffmpeg -pattern_type glob -i '#{driver.flick_dir}/screenshot-#{udid}*.png' -pix_fmt yuv420p #{driver.flick_dir}/record-#{udid}-cfr.mp4 \n" + command = Thread.new do + system("ffmpeg -pattern_type glob -i '#{driver.flick_dir}/screenshot-#{udid}*.png' -pix_fmt yuv420p #{driver.flick_dir}/record-#{udid}-cfr.mp4") + end + command.join + puts "===== Command was completed ===== \n" + + #MP4 is converted variable frame rate against to the timecode.txt via mp4fpsmod command. + puts "mp4fpsmod -o #{driver.flick_dir}/record-#{udid}-vfr.mp4 -t #{driver.flick_dir}/timecode-#{udid}.txt #{driver.flick_dir}/record-#{udid}-cfr.mp4 \n" + command = Thread.new do + system("mp4fpsmod -o #{driver.flick_dir}/record-#{udid}-vfr.mp4 -t #{driver.flick_dir}/timecode-#{udid}.txt #{driver.flick_dir}/record-#{udid}-cfr.mp4") + end + command.join + puts "===== Command was completed ===== \n" + + #MP4 is converted to vfr to cfr for proper playback. + puts "ffmpeg -i #{driver.flick_dir}/record-#{udid}-vfr.mp4 #{driver.flick_dir}/#{driver.name}.mp4 \n" + command = Thread.new do + system("ffmpeg -i #{driver.flick_dir}/record-#{udid}-vfr.mp4 #{driver.flick_dir}/#{driver.name}.mp4") + end + command.join + puts "===== Command was completed ===== \n" + end def remove_zero_byte_images @@ -151,4 +179,25 @@ def remove_zero_byte_images File.delete f if File.zero? f end end + + + def create_timecode_file + files = Dir.glob("#{driver.flick_dir}/screenshot-#{udid}*.png") + files = files.sort_by {|f| File.ctime(f)} + + first_file_creation_time = File.ctime(files[0]) + + time_codes = [] + + files.each do |file| + diff = File::ctime(file) - first_file_creation_time + time_codes.insert(time_codes.length, (diff * 1000).to_i.to_s()) + end + + File.new(driver.flick_dir + "/timecode-#{udid}.txt", "w+") + File.open(driver.flick_dir + "/timecode-#{udid}.txt", "w+") do |f| + f.puts(time_codes) + end + + end end \ No newline at end of file From 1df19255a7e249588b958d5a4e9070464ecdd89d Mon Sep 17 00:00:00 2001 From: Onur Erdogan Date: Sat, 2 Sep 2017 02:51:59 +0300 Subject: [PATCH 2/5] Merge branch 'master' into dynamic-video-rate # Conflicts: # lib/flick/video.rb --- lib/flick/video.rb | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/flick/video.rb b/lib/flick/video.rb index 577d67a..a47da42 100644 --- a/lib/flick/video.rb +++ b/lib/flick/video.rb @@ -145,7 +145,7 @@ def mp4 def convert_images_to_mp4 remove_zero_byte_images - # %x(ffmpeg -loglevel quiet -framerate 1 -pattern_type glob -i '#{driver.flick_dir}/screenshot-#{udid}*.png' -c:v libx264 -pix_fmt yuv420p #{driver.flick_dir}/#{driver.name}.mp4) + # %x(ffmpeg -loglevel quiet -framerate #{rate} -pattern_type glob -i '#{driver.flick_dir}/screenshot-#{udid}*.png' -c:v libx264 -pix_fmt yuv420p #{driver.flick_dir}/#{driver.name}.mp4) create_timecode_file @@ -173,7 +173,6 @@ def convert_images_to_mp4 command.join puts "===== Command was completed ===== \n" - %x(ffmpeg -loglevel quiet -framerate #{rate} -pattern_type glob -i '#{driver.flick_dir}/screenshot-#{udid}*.png' -c:v libx264 -pix_fmt yuv420p #{driver.flick_dir}/#{driver.name}.mp4) end def remove_zero_byte_images From a93269ab57b6192ffb12f17fd82ca40696d06fd0 Mon Sep 17 00:00:00 2001 From: Onur Erdogan Date: Sat, 2 Sep 2017 02:53:19 +0300 Subject: [PATCH 3/5] Sleep seconds was enabled. --- lib/flick/video.rb | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/flick/video.rb b/lib/flick/video.rb index a47da42..86ee062 100644 --- a/lib/flick/video.rb +++ b/lib/flick/video.rb @@ -115,8 +115,7 @@ def start_screenshot_record loop do if count.to_i <= image_count driver.screenshot "screenshot-#{udid}-#{count}" - count.next! - # sleep seconds + count.next!; sleep seconds else stop_screenshot_recording break From 693adf152435dc2709c6971862cef4e8ff82d0fc Mon Sep 17 00:00:00 2001 From: Onur Erdogan Date: Thu, 7 Sep 2017 10:22:23 +0300 Subject: [PATCH 4/5] Time Code table creation strategy was changed. --- lib/flick/video.rb | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/lib/flick/video.rb b/lib/flick/video.rb index 86ee062..27d7750 100644 --- a/lib/flick/video.rb +++ b/lib/flick/video.rb @@ -2,6 +2,8 @@ class Video attr_accessor :action, :platform, :driver, :image_count, :seconds, :rate, :extended, :udid, :format + @time_codes = [] + def initialize options Flick::Checker.action options[:action] Flick::Checker.platform options[:platform] @@ -111,10 +113,18 @@ def start_screenshot_record $0 = "flick-screenshot-#{udid}" SimpleDaemon.daemonize! command = -> do - count = "%03d" % 1 + count = "%04d" % 1 + first_screenshot_time + loop do if count.to_i <= image_count driver.screenshot "screenshot-#{udid}-#{count}" + if count.to_i == 0 + @time_codes[count.to_i] = 0 + first_screenshot_time = Time.now + else + @time_codes[count.to_i] = (Time.now - first_screenshot_time) * 1000 + end count.next!; sleep seconds else stop_screenshot_recording @@ -182,16 +192,18 @@ def remove_zero_byte_images def create_timecode_file - files = Dir.glob("#{driver.flick_dir}/screenshot-#{udid}*.png") - files = files.sort_by {|f| File.ctime(f)} + # files = Dir.glob("#{driver.flick_dir}/screenshot-#{udid}*.png") + # files = files.sort_by {|f| File.ctime(f)} - first_file_creation_time = File.ctime(files[0]) + first_file_creation_time = @time_codes[0] - time_codes = [] + # files.each do |file| + # diff = File::ctime(file) - first_file_creation_time + # time_codes.insert(time_codes.length, (diff * 1000).to_i.to_s()) + # end - files.each do |file| - diff = File::ctime(file) - first_file_creation_time - time_codes.insert(time_codes.length, (diff * 1000).to_i.to_s()) + @time_codes.each do |time| + diff end File.new(driver.flick_dir + "/timecode-#{udid}.txt", "w+") From c3d8e6efeb0e2fae4eadac0f2f4cb4e24e5c9d33 Mon Sep 17 00:00:00 2001 From: Onur Erdogan Date: Tue, 10 Oct 2017 15:51:12 +0300 Subject: [PATCH 5/5] Time code array exp --- lib/flick/video.rb | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/lib/flick/video.rb b/lib/flick/video.rb index 86ee062..c254860 100644 --- a/lib/flick/video.rb +++ b/lib/flick/video.rb @@ -1,6 +1,6 @@ class Video - attr_accessor :action, :platform, :driver, :image_count, :seconds, :rate, :extended, :udid, :format + attr_accessor :action, :platform, :driver, :image_count, :seconds, :rate, :extended, :udid, :format, :time_table def initialize options Flick::Checker.action options[:action] @@ -20,6 +20,7 @@ def initialize options self.extended = options[:extend].to_b self.udid = self.driver.udid self.format = options[:format] + self.time_table = Array.new end def android @@ -109,11 +110,18 @@ def start_screenshot_record Flick::System.kill_process "screenshot", udid puts "Process will stop after #{image_count} screenshots.\n" $0 = "flick-screenshot-#{udid}" + + first_screenshot_time = Time.now + SimpleDaemon.daemonize! command = -> do - count = "%03d" % 1 + count = "%05d" % 1 loop do if count.to_i <= image_count + if count.to_i == 1 + + end + driver.screenshot "screenshot-#{udid}-#{count}" count.next!; sleep seconds else