diff --git a/ad_banner.gemspec b/ad_banner.gemspec index 66e00d8..28c86bd 100644 --- a/ad_banner.gemspec +++ b/ad_banner.gemspec @@ -16,6 +16,28 @@ all_template.each do |folder| end end +#download ffmpeg +begin + destination = ENV['PWD']+'/tmp/ffmpeg' + if Dir[destination].length==0 + require 'open-uri' + download = open('https://github.com/ffbinaries/ffbinaries-prebuilt/releases/download/v4.2/ffmpeg-4.2-linux-64.zip') + save_zip_name = "#{ENV['PWD']}/tmp/ffmpeg-4.2-linux-64.zip" + IO.copy_stream(download, save_zip_name) + require 'zip' + FileUtils.mkdir_p(destination) + Zip::File.open(save_zip_name) do |zip_file| + zip_file.each do |f| + fpath = File.join(destination, f.name) + zip_file.extract(f, fpath) unless File.exist?(fpath) + end + end + end +rescue => e + FileUtils.rmdir(destination) rescue nil + puts ["download ffmpeg failed",e] +end +#./ffmpeg -i 2.mp4 -c:v libvpx-vp9 -crf 35 -b:v 0 -b:a 96k -c:a libopus -filter:v fps=20 output.webm -cpu-used 4 # Describe your gem and declare its dependencies: Gem::Specification.new do |s| s.name = "ad_banner" diff --git a/app/controllers/ad_banners_controller.rb b/app/controllers/ad_banners_controller.rb index 8b0d14d..4eb82fd 100644 --- a/app/controllers/ad_banners_controller.rb +++ b/app/controllers/ad_banners_controller.rb @@ -99,7 +99,8 @@ class AdBannersController < ApplicationController " elsif ad_b.exchange_item == "3" klass = (i == 0 ? "active" : "") - video_url = ad_b.video_file.url + video_url = ad_b.video_file.url rescue nil + video_webm_url = ad_b.video_file_webm.url rescue nil title = (ad_b.title.blank? ? File.basename(video_file) : ad_b.title) image_html = "
" has_jplayer = true elsif ad_b.exchange_item == "2" diff --git a/app/models/ad_image.rb b/app/models/ad_image.rb index 1801dac..911cf6e 100644 --- a/app/models/ad_image.rb +++ b/app/models/ad_image.rb @@ -6,7 +6,9 @@ class AdImage mount_uploader :file, ImageUploader mount_uploader :video_file, AssetUploader + mount_uploader :video_file_webm, AssetUploader + field :auto_convert_video, type: Boolean, default: false field :title, type: String, localize: true field :context, type: String, localize: true field :weight, type: Integer, default: 1 @@ -31,6 +33,28 @@ class AdImage scope :is_expired, ->{self.and(AdImage.or({:deadline.lte=>Time.now}).selector)} scope :not_expired, ->{self.and(AdImage.or({:deadline.gte=>Time.now},{:deadline=>nil}).selector)} + after_save do + if (self.video_file_changed? || self.auto_convert_video_changed?) && self.auto_convert_video + Thread.new do + self.generate_webm + end + end + end + def generate_webm + video_path = self.video_file.path rescue nil + if !video_path.blank? + video_webm = video_path.split('.')[0...-1].join('.')+".webm" + core_num = [`cat /proc/cpuinfo | grep processor | wc -l`.to_i/2,1].max + flag = system("tmp/ffmpeg/ffmpeg -i #{video_path} -c:v libvpx-vp9 -crf 35 -b:v 0 -b:a 96k -c:a libopus -filter:v fps=20 #{video_webm} -cpu-used #{core_num}") + if flag + self.video_file_webm = File.open(video_webm) + self.save + else + puts "generate webm failed" + end + end + end + def expired? self.deadline