Class: RVideo::Transcoder

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

Instance Attribute 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

#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

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

75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
# File 'lib/rvideo/transcoder.rb', line 75

def execute(task, options = {})
  t1 = Time.now

  if @input_file.nil?
    @input_file = options[:input_file]
  end

  RVideo.logger.info("\nNew transcoder job\n================\nTask: #{task}\nOptions: #{options.inspect}")

  if block_given?
    parse_and_execute(task, options) do |tool, progress|
      yield(tool, progress)
    end
  else
    parse_and_execute(task, options)
  end
  
  if @output_file.nil?
    @output_file = options[:output_file]
  end
  result = check_integrity
  RVideo.logger.info("\nFinished task. Total errors: #{@errors.size}\n")
  @total_time = Time.now - t1
  result
rescue TranscoderError => e
  raise e
rescue Exception => e
  handle_unknown_error(e)
end

#originalObject


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

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

#processedObject


49
50
51
52
53
54
55
# File 'lib/rvideo/transcoder.rb', line 49

def processed
  if @output_file
    @processed ||= Inspector.new(:file => @output_file)
  else
    nil
  end
end