Class: FFMPEG::Movie

Inherits:
Object
  • Object
show all
Defined in:
lib/ffmpeg/movie.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(path) ⇒ Movie

Returns a new instance of Movie.

Raises:

  • (Errno::ENOENT)


10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
# File 'lib/ffmpeg/movie.rb', line 10

def initialize(path)
  raise Errno::ENOENT, "the file '#{path}' does not exist" unless File.exists?(path)

  @path = path

  # ffmpeg will output to stderr
  command = "#{FFMPEG.ffmpeg_binary} -i #{Shellwords.escape(path)}"
  output = Open3.popen3(command) { |stdin, stdout, stderr| stderr.read }

  fix_encoding(output)

  output[/Input \#\d+\,\s*(\S+),\s*from/]
  @container = $1

  output[/Duration: (\d{2}):(\d{2}):(\d{2}\.\d{2})/]
  @duration = ($1.to_i*60*60) + ($2.to_i*60) + $3.to_f

  output[/start: (\d*\.\d*)/]
  @time = $1 ? $1.to_f : 0.0

  output[/creation_time {1,}: {1,}(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2})/]
  @creation_time = $1 ? Time.parse("#{$1}") : nil

  output[/bitrate: (\d*)/]
  @bitrate = $1 ? $1.to_i : nil

  output[/rotate\ {1,}:\ {1,}(\d*)/]
  @rotation = $1 ? $1.to_i : nil

  output[/Video:\ (.*) (|(default))/]
  @video_stream = $1

  output[/Audio:\ (.*) (|(default))/]
  @audio_stream = $1

  if @video_stream
    commas_except_in_parenthesis = /(?:\([^()]*\)|[^,])+/ # regexp to handle "yuv420p(tv, bt709)" colorspace etc from http://goo.gl/6oi645
    @video_codec, @colorspace, resolution, video_bitrate = @video_stream.scan(commas_except_in_parenthesis).map(&:strip)
    @video_codec_short = @video_codec.split.first
    @video_bitrate     = video_bitrate =~ %r(\A(\d+) kb/s\Z) ? $1.to_i : nil
    @resolution        = resolution.split(" ").first rescue nil # get rid of [PAR 1:1 DAR 16:9]
    @sizep             = @resolution.split("x").last.to_i rescue nil
    @sar               = $1 if @video_stream[/SAR (\d+:\d+)/]
    @dar               = $1 if @video_stream[/DAR (\d+:\d+)/]
  end

  if @audio_stream
    @audio_codec, audio_sample_rate, @audio_channels, unused, audio_bitrate = @audio_stream.split(/\s?,\s?/)
    @audio_bitrate = audio_bitrate =~ %r(\A(\d+)) ? $1.to_i : nil
    @audio_sample_rate = audio_sample_rate[/\d*/].to_i
  end

  @invalid = true if @video_stream.to_s.empty? && @audio_stream.to_s.empty?
  @invalid = true if output.include?("is not supported")
  @invalid = true if output.include?("could not find codec parameters")
end

Instance Attribute Details

#audio_bitrateObject (readonly)

Returns the value of attribute audio_bitrate.



7
8
9
# File 'lib/ffmpeg/movie.rb', line 7

def audio_bitrate
  @audio_bitrate
end

#audio_codecObject (readonly)

Returns the value of attribute audio_codec.



7
8
9
# File 'lib/ffmpeg/movie.rb', line 7

def audio_codec
  @audio_codec
end

#audio_sample_rateObject (readonly)

Returns the value of attribute audio_sample_rate.



7
8
9
# File 'lib/ffmpeg/movie.rb', line 7

def audio_sample_rate
  @audio_sample_rate
end

#audio_streamObject (readonly)

Returns the value of attribute audio_stream.



7
8
9
# File 'lib/ffmpeg/movie.rb', line 7

def audio_stream
  @audio_stream
end

#bitrateObject (readonly)

Returns the value of attribute bitrate.



5
6
7
# File 'lib/ffmpeg/movie.rb', line 5

def bitrate
  @bitrate
end

#colorspaceObject (readonly)

Returns the value of attribute colorspace.



6
7
8
# File 'lib/ffmpeg/movie.rb', line 6

def colorspace
  @colorspace
end

#containerObject (readonly)

Returns the value of attribute container.



8
9
10
# File 'lib/ffmpeg/movie.rb', line 8

def container
  @container
end

#creation_timeObject (readonly)

Returns the value of attribute creation_time.



5
6
7
# File 'lib/ffmpeg/movie.rb', line 5

def creation_time
  @creation_time
end

#darObject (readonly)

Returns the value of attribute dar.



6
7
8
# File 'lib/ffmpeg/movie.rb', line 6

def dar
  @dar
end

#durationObject (readonly)

Returns the value of attribute duration.



5
6
7
# File 'lib/ffmpeg/movie.rb', line 5

def duration
  @duration
end

#pathObject (readonly)

Returns the value of attribute path.



5
6
7
# File 'lib/ffmpeg/movie.rb', line 5

def path
  @path
end

#resolutionObject (readonly)

Returns the value of attribute resolution.



6
7
8
# File 'lib/ffmpeg/movie.rb', line 6

def resolution
  @resolution
end

#rotationObject (readonly)

Returns the value of attribute rotation.



5
6
7
# File 'lib/ffmpeg/movie.rb', line 5

def rotation
  @rotation
end

#sarObject (readonly)

Returns the value of attribute sar.



6
7
8
# File 'lib/ffmpeg/movie.rb', line 6

def sar
  @sar
end

#sizepObject (readonly)

Returns the value of attribute sizep.



8
9
10
# File 'lib/ffmpeg/movie.rb', line 8

def sizep
  @sizep
end

#timeObject (readonly)

Returns the value of attribute time.



5
6
7
# File 'lib/ffmpeg/movie.rb', line 5

def time
  @time
end

#video_bitrateObject (readonly)

Returns the value of attribute video_bitrate.



6
7
8
# File 'lib/ffmpeg/movie.rb', line 6

def video_bitrate
  @video_bitrate
end

#video_codecObject (readonly)

Returns the value of attribute video_codec.



6
7
8
# File 'lib/ffmpeg/movie.rb', line 6

def video_codec
  @video_codec
end

#video_codec_shortObject (readonly)

Returns the value of attribute video_codec_short.



7
8
9
# File 'lib/ffmpeg/movie.rb', line 7

def video_codec_short
  @video_codec_short
end

#video_streamObject (readonly)

Returns the value of attribute video_stream.



6
7
8
# File 'lib/ffmpeg/movie.rb', line 6

def video_stream
  @video_stream
end

Instance Method Details

#audio_channelsObject



91
92
93
94
95
96
97
# File 'lib/ffmpeg/movie.rb', line 91

def audio_channels
  return nil unless @audio_channels
  return @audio_channels[/\d*/].to_i if @audio_channels["channels"]
  return 1 if @audio_channels["mono"]
  return 2 if @audio_channels["stereo"]
  return 6 if @audio_channels["5.1"]
end

#calculated_aspect_ratioObject



79
80
81
# File 'lib/ffmpeg/movie.rb', line 79

def calculated_aspect_ratio
  aspect_from_dar || aspect_from_dimensions
end

#calculated_pixel_aspect_ratioObject



83
84
85
# File 'lib/ffmpeg/movie.rb', line 83

def calculated_pixel_aspect_ratio
  aspect_from_sar || 1
end

#frame_rateObject



99
100
101
102
# File 'lib/ffmpeg/movie.rb', line 99

def frame_rate
  return nil unless video_stream
  video_stream[/(\d*\.?\d*)\s?fps/] ? $1.to_f : nil
end

#heightObject



75
76
77
# File 'lib/ffmpeg/movie.rb', line 75

def height
  resolution.split("x")[1].to_i rescue nil
end

#screenshot(output_file, options = EncodingOptions.new, transcoder_options = {}, &block) ⇒ Object



108
109
110
# File 'lib/ffmpeg/movie.rb', line 108

def screenshot(output_file, options = EncodingOptions.new, transcoder_options = {}, &block)
  Transcoder.new(self, output_file, options.merge(screenshot: true), transcoder_options).run &block
end

#sizeObject



87
88
89
# File 'lib/ffmpeg/movie.rb', line 87

def size
  File.size(@path)
end

#transcode(output_file, options = EncodingOptions.new, transcoder_options = {}, &block) ⇒ Object



104
105
106
# File 'lib/ffmpeg/movie.rb', line 104

def transcode(output_file, options = EncodingOptions.new, transcoder_options = {}, &block)
  Transcoder.new(self, output_file, options, transcoder_options).run &block
end

#valid?Boolean

Returns:

  • (Boolean)


67
68
69
# File 'lib/ffmpeg/movie.rb', line 67

def valid?
  not @invalid
end

#widthObject



71
72
73
# File 'lib/ffmpeg/movie.rb', line 71

def width
  resolution.split("x")[0].to_i rescue nil
end