Skip to main content

Convert videos using ffmpeg by ffmpeg_paperclip-Rails

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:-
  1. your uploaded videos get converted into required formats(compatible on all browsers) before saving using ffmpeg through ffmpeg-paperclip
  2. moreover,you will also get screenshot(2 different images)of every video uploaded + AMAZON S3(you can even store locally,refer Paperclip)
  3. if you want the background job to process video conversion then,use delayed_paperclip 
i will show you how you can convert your uploaded videos into required formats and why we need to convert ....well refer this .Before starting make sure that you have ffpmeg installed with all libraries needed,so click the above link instead of searching for how to install ffmpeg and install it(will take around 30mins.but its worthy).
Here i am using mediaelement.js and Rails 3.2.13
The below code is expecting that:
  1. you have a working upload using paperclip(usually 3.5.1)
  2. Amazon s3 configured,if not then view my recent post to configure S3 on rails
  3. you must have ffmpeg installed 
my Gemfile looks like this:

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
  ##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:-

  1. video.source.url-gives original uploaded video
  2. video.source.url(:mp4video)-gives uploaded video in mp4
  3. video.source.url(:small)-gives uploaded video screenshot(for poster attribute in video_tag)

Comments

jusaf said…
Hi. This is nice but if for example the original video is a MP4 already, it gets encoded again. how could we change this so that if the original video is already one of the target styles then it should skip that encoding?
Milind said…
Apology for the late reply, you can upload any video and this will get converted in the three formats supported by almost all the browers today.
However, its good if you can test different formats like mp4, mov/quicktime, mkv, flv, avi, webm and 3gp.

Popular posts from this blog

Configure amazon s3 with your rails app in just 5 mins

if you are looking to make use of your uploads using paperclip on AMAZON S3,then this is something that will help you. i tried the same and wasted 5 days but its very easy by using ONLY aws-sdk gem and you can start uploading to S3.  Before starting i assume few thing from you: You have a running rails app ready. You have an active AMAZON S3 account (get the credentials,you will need it now) You are using paperclip 3.5.1 (i prefer) You uploads are saving to your system locally short preview of the sequence you need to understand: START -> get aws-sdk gem -> create new s3.yml -> configure an initializer-paperclip.rb using AMAZON S3 credentials ----END----------THAT'S IT lets get started: Install 'aws-sdk' gem by including in gemfile and running bundle install. Gemfile: gem 'paperclip' , '3.5.1' gem "aws-sdk"   Create new yml file such as config/s3.yml and store your AMAZON S3 credentials as shown below...

Using Geocoder to get street name,state,city,country etc in Your Rails app

Recently i implemented Google map for one of the module where User will enter his location/address and other relevant geo-details should get autopopulated.Well,This was posible because of   Geocoder  and by using it you can get every small details such as postalcode,country code,zipcode,street name,state name,state code,latitude,longitude(and more) ready in your hands easily.Its really awesome. I have used to it get all relevant information about the location that the user enter using Geocomplete ,another awesome autocomplete library to get locations. Suppose you have a users table and also few columns such as longitude,latitude,state,postal code,street name,address,country  and want to autopopulate other fields just by using address entered by the user then you are reading the right blog,So its easy,let me show you how. User will enter address using Geocomplete and store that address in address column in users/locations table Then,use Geocoder to fetch other geo...