RVideo is now available as a Ruby gem. Install with:
sudo gem install rvideo
(RVideo depends on other tools for transcoding, like ffmpeg, so you’ll probably need to install a few other things as well. See the Documentation for a little more detail.)
I’ve tagged this release as 0.9.0. It is still beta-quality code, so test thoroughly. If you run into problems, let me know – I’ll be deploying RVideo to a live app soon, so I want to squash any bugs as much as you do. :)
What is it?
RVideo is a Ruby library for video/audio transcoding. It provides a clean Ruby interface to transcoding tools like ffmpeg, and can easily be extended to support more tools. At this point, only ffmpeg and flvtool2 are supported, but more will follow.
1 2 |
transcoder.execute(recipe, {:input_file => "/path/to/input.mp4",
:output_file => "/path/to/output.flv", :resolution => "640x360"}) |
Details
To inspect a file, initialize an RVideo file inspector object. See the documentation for details.
A few examples:
1 2 3 4 5 6 7 8 9 |
file = RVideo::Inspector.new(:file => "#{APP_ROOT}/files/input.mp4") file = RVideo::Inspector.new(:raw_response => ffmpeg_inspection_response) file = RVideo::Inspector.new(:file => "#{APP_ROOT}/files/input.mp4", :ffmpeg_binary => "#{APP_ROOT}/bin/ffmpeg") file.fps # => "29.97" file.duration # => "00:05:23.4" |
To transcode a video, initialize a Transcoder object.
transcoder = RVideo::Transcoder.new |
Then pass a command and valid options to the execute method
1 2 3 4 5 6 7 8 9 |
recipe = "ffmpeg -i $input_file$ -ar 22050 -ab 64 -f flv -r 29.97 -s" recipe += " $resolution$ -y $output_file$" recipe += "\nflvtool2 -U $output_file$" begin transcoder.execute(recipe, {:input_file => "/path/to/input.mp4", :output_file => "/path/to/output.flv", :resolution => "640x360"}) rescue TranscoderError => e puts "Unable to transcode file: #{e.class} - #{e.message}" end |
If the job succeeds, you can access the metadata of the input and output files with:
1 2 |
transcoder.original # RVideo::Inspector object transcoder.processed # RVideo::Inspector object |
If the transcoding succeeds, the file may still have problems. RVideo will populate an errors array if the duration of the processed video differs from the duration of the original video, or if the processed file is unreadable.
RVideo supports any transcoding tool with a command-line interface; adding a new tool just means writing a class for the tool that subclasses RVideo::AbstractTool. It also means that you need to use common sense to avoid attacks. For example: don’t run RVideo as a privileged user. Control your input recipes, and don’t accept user-submitted recipes. (RVideo is pretty well protected from these problems; you can’t execute a command that isn’t identified by a transcoder tool class, so `rm -rf *` won’t work. But it pays to be cautious.)
More info
See the RVideo Google Code site for more info, including links to Documentation and a Google discussion group. Use these to file tickets, discuss, etc. (The SVN repository is currently at Rubyforge, but I may move it to Google Code.)
Contribute
I would love help on this project. If you want to help out, there are a few things you can do.
- Use, test, and submit bugs/patches
- We need a RVideo::Tools::Mencoder class to add mencoder support. (Someone has started on this, so let me know if you’re interested in helping and I’ll put you in touch.)
- Other tool classes would be great – On2, mp4box, Quicktime (?), etc.
- Eventually, it would be great to (optionally) use the processing feedback provided by ffmpeg etc. to get real-time progress updates (e.g. 20% complete, 40% complete, 90% complete). (More info)
- Submit other fixes, features, optimizations, and refactorings
