Class: RVideo::Transcoder

Inherits:
Object
  • Object
show all
Defined in:
lib/rvideo/transcoder.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(input_file = nil) ⇒ Transcoder

To transcode a video, initialize a Transcoder object:

transcoder = RVideo::Transcoder.new("/path/to/input.mov")

Then pass a recipe and valid options to the execute method

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, {: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:

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.



35
36
37
38
39
40
41
42
43
# File 'lib/rvideo/transcoder.rb', line 35

def initialize(input_file = nil)
  # Allow a nil input_file for backwards compatibility. (Change at 1.0?)
  check_input_file(input_file)
  
  @input_file = input_file
  @executed_commands = []
  @errors = []
  @warnings = []
end

Instance Attribute Details

#errorsObject (readonly)

Returns the value of attribute errors.



4
5
6
# File 'lib/rvideo/transcoder.rb', line 4

def errors
  @errors
end

#executed_commandsObject (readonly)

Returns the value of attribute executed_commands.



4
5
6
# File 'lib/rvideo/transcoder.rb', line 4

def executed_commands
  @executed_commands
end

#processedObject (readonly)

Returns the value of attribute processed.



4
5
6
# File 'lib/rvideo/transcoder.rb', line 4

def processed
  @processed
end

#total_timeObject (readonly)

Returns the value of attribute total_time.



4
5
6
# File 'lib/rvideo/transcoder.rb', line 4

def total_time
  @total_time
end

#warningsObject (readonly)

Returns the value of attribute warnings.



4
5
6
# File 'lib/rvideo/transcoder.rb', line 4

def warnings
  @warnings
end

Class Method Details

.loggerObject



60
61
62
63
64
65
66
# File 'lib/rvideo/transcoder.rb', line 60

def self.logger
  if @logger.nil?
    @logger = Logger.new('/dev/null')
  end
  
  @logger
end

.logger=(l) ⇒ Object

Configure logging. Pass a valid Ruby logger object.

logger = Logger.new(STDOUT)
RVideo::Transcoder.logger = logger


56
57
58
# File 'lib/rvideo/transcoder.rb', line 56

def self.logger=(l)
  @logger = l
end

Instance Method Details

#execute(task, options = {}) ⇒ Object

Requires a command and a hash of various interpolated options. The command should be one or more lines of transcoder tool commands (e.g. ffmpeg, flvtool2). Interpolate options by adding $option_key$ to the recipe, and passing :option_key => “value” in the options hash.

recipe = "ffmpeg -i $input_file$ -ar 22050 -ab 64 -f flv -r 29.97 
recipe += "-s $resolution$ -y $output_file$"
recipe += "\nflvtool2 -U $output_file$"

transcoder = RVideo::Transcoder.new("/path/to/input.mov")
begin
  transcoder.execute(recipe, {:output_file => "/path/to/output.flv", :resolution => "320x240"})
rescue TranscoderError => e
  puts "Unable to transcode file: #{e.class} - #{e.message}"
end


86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
# File 'lib/rvideo/transcoder.rb', line 86

def execute(task, options = {})
  t1 = Time.now
  
  if @input_file.nil?
    @input_file = options[:input_file]
  end
  
  Transcoder.logger.info("\nNew transcoder job\n================\nTask: #{task}\nOptions: #{options.inspect}")
  parse_and_execute(task, options)      
  @processed = Inspector.new(:file => options[:output_file])
  result = check_integrity
  Transcoder.logger.info("\nFinished task. Total errors: #{@errors.size}\n")
  @total_time = Time.now - t1
  result
rescue TranscoderError => e
  raise e
rescue Exception => e
  Transcoder.logger.error("[ERROR] Unhandled RVideo exception: #{e.class} - #{e.message}\n#{e.backtrace}")
  raise TranscoderError::UnknownError, "Unexpected RVideo error: #{e.message} (#{e.class})", e.backtrace
end

#originalObject



45
46
47
# File 'lib/rvideo/transcoder.rb', line 45

def original
  @original ||= Inspector.new(:file => @input_file)
end