Video encoding made easy with AWS
Перейти к файлу
Martyn Loughran f7a2d300cd Cleanup and move more logic out of Videos upload action
* Moved video processing logic out of the Videos upload action
* Teseted processing code in isolation in Video
* Updated and cleaned up specs on Videos controller
2008-10-09 13:30:26 +01:00
app Cleanup and move more logic out of Videos upload action 2008-10-09 13:30:26 +01:00
benchmarks Benchmark tests for RVideo capture_frame. 2008-10-07 18:22:49 +01:00
config Check that required directories exist when Panda starts. 2008-10-08 13:13:05 +01:00
lib Extracted private_filepath into LocalStore and speced this module. 2008-10-08 13:29:40 +01:00
log Created log dir 2008-09-24 13:19:19 +01:00
public Finished refactoring the thumbnail code out of video controller and got the UI working correctly. 2008-10-06 14:29:40 +01:00
script
spec Cleanup and move more logic out of Videos upload action 2008-10-09 13:30:26 +01:00
.gitignore Integrated Clipping object into existing code (removed lots of code from Video) 2008-10-07 17:09:14 +01:00
LICENSE more explicit license 2008-09-16 21:55:48 +01:00
README
README_EC2 - Changed root dir from /usr/local/www to /var/local/www. We will soon to update AMI,too. 2008-09-23 15:52:02 +01:00
Rakefile
panda.god Add notifier to God recipe. 2008-09-30 16:04:27 +01:00
panda_nginx.conf.example - Changed root dir from /usr/local/www to /var/local/www. We will soon to update AMI,too. 2008-09-23 15:52:02 +01:00

README

Panda is a Merb app which runs on a special EC2 instance to encode videos for you. Uploaded videos are stored on S3 with a small amount of info kept in SimpleDB. The REST API makes it easy to integrate user video uploading into your web application.

How does Panda work?
====================

1. Video is uploaded to panda
2. Panda checks the video's metadata, uploads the raw file to S3 and adds it to the encoding queue
3. The encoder application picks the encoding job off the queue when it's free and encodes the video to all possible formats
4. Panda sends a callback to your web application notifying you the video has been encoded
5. You use the S3 url of the encoding you want to show to your users

Installation and setup
======================

Gems
----

Merb 0.9.2
S3 (http://amazon.rubyforge.org/)
SimpleDB (http://nytimes.rubyforge.org/amazon_sdb/)

gem install merb merb_helpers activesupport RubyInline amazon_sdb sqs

Other deps
----------

# libjpeg
http://www.ijg.org/
http://www.libgd.org/FAQ#gd_keeps_saying_it_can.27t_find_png_or_jpeg_support._I_did_install_libpng_and_libjpeg._What_am_I_missing.3F

# libgd
http://www.libgd.org/Main_Page

RVideo
------

Build gem from svn://rubyforge.org/var/svn/rvideo/trunk with `rake install_gem`.
Then `sudo cp lib/rvideo/tools/*.rb  /Library/Ruby/Gems/1.8/gems/rvideo-0.9.4/lib/rvideo/tools/` on OS X.

FFMPEG
-----

Available in all good package repositories including Darwin Ports.

If you're developing on Mac OS X, you can grab ffmpeg out of the ffmpegX application instead of compiling it: http://www.macosxhints.com/article.php?story=20061220082125312

Configuration
=============

Encoding profiles
-----------------

    Profile.create!(:title => "MP4 SD",   :container => "mp4", :video_codec => "mpeg4", :video_bitrate => 300, :audio_codec => "aac", :audio_bitrate => 48, :audio_sample_rate => 48000, :width => 320, :height => 240, :fps => 24, :position => 2, :player => nil)

    Profile.create!(:title => "Flash video SD",  :container => "flv", :video_bitrate => 300, :audio_bitrate => 48, :width => 320, :height => 240, :fps => 24, :position => 0, :player => "flash")
    Profile.create!(:title => "Flash video HI",  :container => "flv", :video_bitrate => 400, :audio_bitrate => 48, :width => 480, :height => 360, :fps => 24, :position => 1, :player => "flash")
    
    Profile.create!(:title => "Flash h264 SD",   :container => "mp4", :video_bitrate => 300, :audio_codec => "aac", :audio_bitrate => 48, :width => 320, :height => 240, :fps => 24, :position => 2, :player => "flash")
    
    
    Profile.create!(:title => "Flash h264 HI",   :container => "mp4", :video_bitrate => 400, :audio_bitrate => 48, :audio_coded => "aac", :width => 480, :height => 360, :fps => 24, :position => 3, :player => "flash")
    Profile.create!(:title => "Flash h264 480p", :container => "mp4", :video_bitrate => 600, :audio_bitrate => 48, :audio_coded => "aac", :width => 852, :height => 480, :fps => 24, :position => 4, :player => "flash")

Further information
===================

Investigating encoding errors
-----------------------------

When an encoding fails the status of the video is set to 'error' and the output of ffmpeg is saved on S3 with the filename video_token.error

SimpleDB schemas
================

Videos
------

    filename # 976a4b00-16cc-012b-7316-001ec2b5c0e1.flv
    original_filename # sneezing_panda.flv
    parent

    status # original, queued, processing, done, error

    duration
    container
    width
    height

    video_codec
    video_bitrate
    fps
    audio_codec
    audio_sample_rate

    profile # id of encoding profile used
    profile_title

    updated_at
    created_at

Encoding profiles
-----------------

    title

    container
    width
    height

    video_codec
    video_bitrate
    fps
    audio_codec
    audio_bitrate
    audio_sample_rate

    updated_at
    created_at