Recently i implemented video uploads at S3 using ffmpeg-paperclip and ffmpeg where my uploaded videos get converted into mp4,webm and ogg(most required formats) along with 2 screenshots(with diff sizes) and stored at S3.
its so wonderful in many ways:-
its so wonderful in many ways:-
- your uploaded videos get converted into required formats(compatible on all browsers) before saving using ffmpeg through ffmpeg-paperclip
- moreover,you will also get screenshot(2 different images)of every video uploaded + AMAZON S3(you can even store locally,refer Paperclip)
- if you want the background job to process video conversion then,use delayed_paperclip
Here i am using mediaelement.js and Rails 3.2.13
The below code is expecting that:
- you have a working upload using paperclip(usually 3.5.1)
- Amazon s3 configured,if not then view my recent post to configure S3 on rails
- you must have ffmpeg installed
gem 'paperclip', '3.5.1'gem "aws-sdk"
gem "paperclip-ffmpeg"gem 'delayed_paperclip'
video.rb(convert to mp4,webm and ogg with two screenshots )
class Video < ActiveRecord::Base
default_scope order: 'created_at DESC'
has_attached_file :source,
:default_url => '/dashboard/default_avatar.jpg',
:styles => {
:mp4video => { :geometry => '520x390', :format => 'mp4',
:convert_options => { :output => { :vcodec => 'libx264',
:vpre => 'ipod640', :b => '250k', :bt => '50k',
:acodec => 'libfaac', :ab => '56k', :ac => 2 } } },
:oggvideo => { :geometry => '520x390', :format => 'ogg',
:convert_options => { :output => { :vcodec => 'libtheora',
:b => '250k', :bt => '50k', :acodec => 'libvorbis',
:ab => '56k', :ac => 2 } } },
:webmvideo => { :geometry => '520x390', :format => 'webm',
:convert_options => { :output => { :vcodec => 'libvpx',
:b => '250k', :bt => '50k', :acodec => 'libvorbis',
:ab => '56k', :ac => 2 } } },
:view => { :geometry => '520x390', :format => 'jpg', :time => 2 },
:preview => { :geometry => '160x120', :format => 'jpg', :time => 2 }
},
processors: [:ffmpeg],
:max_size => 300.megabytes,
:storage => :s3,
:s3_credentials => S3_CREDENTIALS
default_scope order: 'created_at DESC'
has_attached_file :source,
:default_url => '/dashboard/default_avatar.jpg',
:styles => {
:mp4video => { :geometry => '520x390', :format => 'mp4',
:convert_options => { :output => { :vcodec => 'libx264',
:vpre => 'ipod640', :b => '250k', :bt => '50k',
:acodec => 'libfaac', :ab => '56k', :ac => 2 } } },
:oggvideo => { :geometry => '520x390', :format => 'ogg',
:convert_options => { :output => { :vcodec => 'libtheora',
:b => '250k', :bt => '50k', :acodec => 'libvorbis',
:ab => '56k', :ac => 2 } } },
:webmvideo => { :geometry => '520x390', :format => 'webm',
:convert_options => { :output => { :vcodec => 'libvpx',
:b => '250k', :bt => '50k', :acodec => 'libvorbis',
:ab => '56k', :ac => 2 } } },
:view => { :geometry => '520x390', :format => 'jpg', :time => 2 },
:preview => { :geometry => '160x120', :format => 'jpg', :time => 2 }
},
processors: [:ffmpeg],
:max_size => 300.megabytes,
:storage => :s3,
:s3_credentials => S3_CREDENTIALS
##here comes delayed video processing using delayed_papeclip
process_in_background :source , :processing_image_url => "/images/loading.gif"
if you want to use default styles as let FFMPEG decide the best specifications for the videos to convert,then you can just use:-
:styles => {
:mp4video => { :geometry => "640x480", :format => 'mp4', :convert_options => {:output => {:ar => 44100}} },
:webmvideo =>{ :geometry => "1024x576", :format => 'webm', :convert_options => {:output => {:ar => 44100}} },
:oggvideo => { :geometry => "1024x576", :format => 'ogg', :convert_options => {:output => {:ar => 44100}} }
}
Access the uploaded video:-
- video.source.url-gives original uploaded video
- video.source.url(:mp4video)-gives uploaded video in mp4
- video.source.url(:small)-gives uploaded video screenshot(for poster attribute in video_tag)
Comments
However, its good if you can test different formats like mp4, mov/quicktime, mkv, flv, avi, webm and 3gp.