dragonfly-ffmpeg 0.1.5 → 0.1.6

Sign up to get free protection for your applications and to get access to all the features.
@@ -30,69 +30,73 @@ module EnMasse
30
30
  end
31
31
 
32
32
  def frame_rate(temp_object)
33
- inspect(:frame_rate, temp_object)
33
+ inspect_movie(:frame_rate, temp_object)
34
34
  end
35
35
  alias_method :fps, :frame_rate
36
36
 
37
37
  def duration(temp_object)
38
- inspect(:duration, temp_object)
38
+ inspect_movie(:duration, temp_object)
39
39
  end
40
40
 
41
41
  def bitrate(temp_object)
42
- inspect(:bitrate, temp_object)
42
+ inspect_movie(:bitrate, temp_object)
43
43
  end
44
44
 
45
45
  def size(temp_object)
46
- inspect(:size, temp_object)
46
+ inspect_movie(:size, temp_object)
47
47
  end
48
48
 
49
49
  def video_stream(temp_object)
50
- inspect(:video_stream, temp_object)
50
+ inspect_movie(:video_stream, temp_object)
51
51
  end
52
52
 
53
53
  def video_codec(temp_object)
54
- inspect(:video_codec, temp_object)
54
+ inspect_movie(:video_codec, temp_object)
55
55
  end
56
56
 
57
57
  def colorspace(temp_object)
58
- inspect(:colorspace, temp_object)
58
+ inspect_movie(:colorspace, temp_object)
59
59
  end
60
60
 
61
61
  def resolution(temp_object)
62
- inspect(:resolution, temp_object)
62
+ inspect_movie(:resolution, temp_object)
63
63
  end
64
64
 
65
65
  def v_width(temp_object)
66
- inspect(:width, temp_object)
66
+ inspect_movie(:width, temp_object)
67
67
  end
68
68
 
69
69
  def v_height(temp_object)
70
- inspect(:height, temp_object)
70
+ inspect_movie(:height, temp_object)
71
71
  end
72
72
 
73
73
  def audio_stream(temp_object)
74
- inspect(:audio_stream, temp_object)
74
+ inspect_movie(:audio_stream, temp_object)
75
75
  end
76
76
 
77
77
  def audio_codec(temp_object)
78
- inspect(:audio_codec, temp_object)
78
+ inspect_movie(:audio_codec, temp_object)
79
79
  end
80
80
 
81
81
  def audio_sample_rate(temp_object)
82
- inspect(:audio_sample_rate, temp_object)
82
+ inspect_movie(:audio_sample_rate, temp_object)
83
+ end
84
+
85
+ def audio_bitrate(temp_object)
86
+ inspect_movie(:audio_bitrate, temp_object)
83
87
  end
84
88
 
85
89
  def audio_channels(temp_object)
86
- inspect(:audio_channels, temp_object)
90
+ inspect_movie(:audio_channels, temp_object)
87
91
  end
88
92
 
89
93
  def valid?(temp_object)
90
- inspect(:valid?, temp_object)
94
+ inspect_movie(:valid?, temp_object)
91
95
  end
92
96
 
93
97
  private
94
98
 
95
- def inspect(method, temp_object)
99
+ def inspect_movie(method, temp_object)
96
100
  ::FFMPEG::Movie.new(temp_object.path).send(method)
97
101
  end
98
102
 
@@ -34,6 +34,7 @@ module EnMasse
34
34
  :frame_rate => 29.97,
35
35
  :video_bitrate => 3072,
36
36
  :audio_codec => "libfaac",
37
+ :audio_bitrate => 128,
37
38
  :audio_channels => 2,
38
39
  :audio_sample_rate => 48000,
39
40
  :video_preset => "hq"
@@ -46,6 +47,7 @@ module EnMasse
46
47
  :frame_rate => 29.97,
47
48
  :video_bitrate => 3072,
48
49
  :audio_codec => "libvorbis",
50
+ :audio_bitrate => 128,
49
51
  :audio_channels => 2,
50
52
  :audio_sample_rate => 48000
51
53
  )
@@ -57,6 +59,7 @@ module EnMasse
57
59
  :frame_rate => 29.97,
58
60
  :video_bitrate => 3072,
59
61
  :audio_codec => "libvorbis",
62
+ :audio_bitrate => 128,
60
63
  :audio_channels => 2,
61
64
  :audio_sample_rate => 48000,
62
65
  :custom => "-f webm"
@@ -89,6 +92,11 @@ module EnMasse
89
92
  tempfile = new_tempfile(format, original_basename)
90
93
  transcoded_file = origin.transcode(tempfile.path, options)
91
94
 
95
+ if(format.to_s == 'mp4' && `qt-faststart`)
96
+ `qt-faststart #{transcoded_file.path} #{transcoded_file.path}.tmp.mp4`
97
+ `mv #{transcoded_file.path}.tmp.mp4 #{transcoded_file.path}`
98
+ end
99
+
92
100
  content = ::Dragonfly::TempObject.new(File.new(transcoded_file.path))
93
101
  meta = {
94
102
  :name => (original_basename + ".#{format}"),
@@ -19,7 +19,7 @@
19
19
  module EnMasse
20
20
  module Dragonfly
21
21
  module FFMPEG
22
- VERSION = "0.1.5"
22
+ VERSION = "0.1.6"
23
23
  end
24
24
  end
25
25
  end
@@ -31,7 +31,7 @@ describe EnMasse::Dragonfly::FFMPEG::Analyser do
31
31
  @analyser.ext(@video).should == '.mov'
32
32
  end
33
33
 
34
- it "should return the width" do
34
+ it "should return the width" do
35
35
  @analyser.v_width(@video).should == 1280
36
36
  end
37
37
 
@@ -44,7 +44,7 @@ describe EnMasse::Dragonfly::FFMPEG::Analyser do
44
44
  end
45
45
 
46
46
  it "should return the duration" do
47
- @analyser.duration(@video).should == 0.6
47
+ (@analyser.duration(@video)*10).to_i.should == 6
48
48
  end
49
49
 
50
50
  it "should return the bit rate" do
@@ -71,6 +71,10 @@ describe EnMasse::Dragonfly::FFMPEG::Analyser do
71
71
  @analyser.resolution(@video).should == "1280x720"
72
72
  end
73
73
 
74
+ it "should return the bit rate" do
75
+ @analyser.audio_bitrate(@video).should == 89
76
+ end
77
+
74
78
  it "should return the audio stream" do
75
79
  @analyser.audio_stream(@video).should == "aac, 48000 Hz, stereo, s16, 89 kb/s"
76
80
  end
@@ -64,13 +64,14 @@ describe EnMasse::Dragonfly::FFMPEG::Encoder do
64
64
  end
65
65
  end
66
66
 
67
- describe "encode with an inline defined encoding profile" do
67
+ describe "encode with an inline defined encoding profile (:webm)" do
68
68
  let(:profile) do
69
69
  EnMasse::Dragonfly::FFMPEG::Encoder::Profile.new(:webm_720p,
70
70
  :video_codec => "libvpx",
71
71
  :resolution => "1280x720",
72
72
  :frame_rate => 29.97,
73
73
  :video_bitrate => 3072,
74
+ :audio_bitrate => 128,
74
75
  :audio_codec => "libvorbis",
75
76
  :audio_channels => 2,
76
77
  :audio_sample_rate => 48000,
@@ -96,8 +97,114 @@ describe EnMasse::Dragonfly::FFMPEG::Encoder do
96
97
  video.should have_bitrate(profile.encoding_options[:video_bitrate])
97
98
  end
98
99
 
100
+ it "should have the specified audio bitrate" do
101
+ video.should have_audio_bitrate(profile.encoding_options[:audio_bitrate])
102
+ end
103
+
104
+ it "should have the specified audio codec" do
105
+ video.should have_audio_codec("vorbis")
106
+ end
107
+
108
+ it "should have the specified number of audio channels" do
109
+ video.should have_audio_channels(profile.encoding_options[:audio_channels])
110
+ end
111
+
112
+ it "should have the specified audio sample rate" do
113
+ video.should have_audio_sample_rate(profile.encoding_options[:audio_sample_rate])
114
+ end
115
+ end
116
+
117
+
118
+ describe "encode with an inline defined encoding profile (ogv)" do
119
+ let(:profile) do
120
+ EnMasse::Dragonfly::FFMPEG::Encoder::Profile.new(:ogv,
121
+ :video_codec => "libtheora",
122
+ :resolution => "1280x720",
123
+ :frame_rate => 29.97,
124
+ :video_bitrate => 3072,
125
+ :audio_bitrate => 128,
126
+ :audio_codec => "libvorbis",
127
+ :audio_channels => 2,
128
+ :audio_sample_rate => 48000
129
+ )
130
+ end
131
+
132
+ let(:video) { subject.encode(raw_video, :ogv, profile).first }
133
+
134
+ it "should have the specified video codec" do
135
+ video.should have_video_codec("theora")
136
+ end
137
+
138
+ it "should have the specified resolution" do
139
+ video.should have_resolution(profile.encoding_options[:resolution])
140
+ end
141
+
142
+ it "should have the specified frame rate" do
143
+ video.should have_frame_rate(profile.encoding_options[:frame_rate])
144
+ end
145
+
146
+ it "should have the specified bitrate" do
147
+ bitrate = EnMasse::Dragonfly::FFMPEG::Analyser.new.bitrate(video)
148
+ bitrate.should be_within(17).of(profile.encoding_options[:video_bitrate])
149
+ end
150
+
151
+ it "should have the specified audio bitrate" do
152
+ video.should have_audio_bitrate(profile.encoding_options[:audio_bitrate])
153
+ end
154
+
99
155
  it "should have the specified audio codec" do
100
- video.should have_audio_codec(profile.encoding_options[:audio_codec])
156
+ video.should have_audio_codec("vorbis")
157
+ end
158
+
159
+ it "should have the specified number of audio channels" do
160
+ video.should have_audio_channels(profile.encoding_options[:audio_channels])
161
+ end
162
+
163
+ it "should have the specified audio sample rate" do
164
+ video.should have_audio_sample_rate(profile.encoding_options[:audio_sample_rate])
165
+ end
166
+ end
167
+
168
+ describe "encode with an inline defined encoding profile (mp4)" do
169
+ let(:profile) do
170
+ EnMasse::Dragonfly::FFMPEG::Encoder::Profile.new(:mp4,
171
+ :video_codec => "libx264",
172
+ :resolution => "1280x720",
173
+ :frame_rate => 29.97,
174
+ :video_bitrate => 3072,
175
+ :audio_bitrate => 128,
176
+ :audio_codec => "libfaac",
177
+ :audio_channels => 2,
178
+ :audio_sample_rate => 48000,
179
+ :video_preset => "hq"
180
+ )
181
+ end
182
+
183
+ let(:video) { subject.encode(raw_video, :mp4, profile).first }
184
+
185
+ it "should have the specified video codec" do
186
+ video.should have_video_codec("h264")
187
+ end
188
+
189
+ it "should have the specified resolution" do
190
+ video.should have_resolution(profile.encoding_options[:resolution])
191
+ end
192
+
193
+ it "should have the specified frame rate" do
194
+ video.should have_frame_rate(profile.encoding_options[:frame_rate])
195
+ end
196
+
197
+ it "should have the specified bitrate" do
198
+ bitrate = EnMasse::Dragonfly::FFMPEG::Analyser.new.bitrate(video)
199
+ bitrate.should be_within(17).of(profile.encoding_options[:video_bitrate])
200
+ end
201
+
202
+ it "should have the specified audio bitrate" do
203
+ video.should have_audio_bitrate(profile.encoding_options[:audio_bitrate])
204
+ end
205
+
206
+ it "should have the specified audio codec" do
207
+ video.should have_audio_codec("aac")
101
208
  end
102
209
 
103
210
  it "should have the specified number of audio channels" do
@@ -120,5 +227,7 @@ describe EnMasse::Dragonfly::FFMPEG::Encoder do
120
227
  subject.encode(raw_video, :webm, :a_fake_profile)
121
228
  }.should raise_error(EnMasse::Dragonfly::FFMPEG::UnknownEncoderProfile)
122
229
  end
230
+
231
+
123
232
 
124
233
  end
@@ -17,8 +17,8 @@
17
17
  #
18
18
 
19
19
  require 'rubygems'
20
- require 'bundler'
21
- Bundler.setup(:default, :test)
20
+ #require 'bundler'
21
+ #Bundler.setup(:default, :test)
22
22
  require 'spork'
23
23
 
24
24
  Spork.prefork do
@@ -21,6 +21,16 @@ RSpec::Matchers.define :have_video_codec do |v_codec|
21
21
  analyser = EnMasse::Dragonfly::FFMPEG::Analyser.new
22
22
  analyser.video_codec(given) == v_codec.to_s
23
23
  end
24
+
25
+ failure_message_for_should do |given|
26
+ analyser = EnMasse::Dragonfly::FFMPEG::Analyser.new
27
+ "Expected codec #{v_codec}, but got #{analyser.video_codec(given)}"
28
+ end
29
+
30
+ failure_message_for_should_not do |given|
31
+ analyser = EnMasse::Dragonfly::FFMPEG::Analyser.new
32
+ "Expected codec to not be #{v_codec}, but got #{analyser.video_codec(given)}"
33
+ end
24
34
  end
25
35
 
26
36
  RSpec::Matchers.define :have_resolution do |resolution|
@@ -33,35 +43,82 @@ end
33
43
  RSpec::Matchers.define :have_frame_rate do |frame_rate|
34
44
  match do |given|
35
45
  analyser = EnMasse::Dragonfly::FFMPEG::Analyser.new
36
- analyser.frame_rate(given) == frame_rate.to_s
46
+ analyser.frame_rate(given) == frame_rate
47
+ end
48
+
49
+ failure_message_for_should do |given|
50
+ analyser = EnMasse::Dragonfly::FFMPEG::Analyser.new
51
+ "Expected frame_rate #{frame_rate}, but got #{analyser.frame_rate(given)}"
52
+ end
53
+
54
+ failure_message_for_should_not do |given|
55
+ analyser = EnMasse::Dragonfly::FFMPEG::Analyser.new
56
+ "Expected frame_rate to not be #{frame_rate}, but got #{analyser.frame_rate(given)}"
37
57
  end
38
58
  end
39
59
 
40
60
  RSpec::Matchers.define :have_bitrate do |bitrate|
41
61
  match do |given|
42
62
  analyser = EnMasse::Dragonfly::FFMPEG::Analyser.new
43
- analyser.bitrate(given) == bitrate.to_s
63
+ analyser.bitrate(given) == bitrate
64
+ end
65
+
66
+ failure_message_for_should do |given|
67
+ analyser = EnMasse::Dragonfly::FFMPEG::Analyser.new
68
+ "Expected bitrate #{bitrate}, but got #{analyser.bitrate(given)}"
69
+ end
70
+
71
+ failure_message_for_should_not do |given|
72
+ analyser = EnMasse::Dragonfly::FFMPEG::Analyser.new
73
+ "Expected bitrate to not be #{bitrate}, but got #{analyser.bitrate(given)}"
74
+ end
75
+ end
76
+
77
+ RSpec::Matchers.define :have_audio_bitrate do |bitrate|
78
+ match do |given|
79
+ analyser = EnMasse::Dragonfly::FFMPEG::Analyser.new
80
+ analyser.audio_bitrate(given) == bitrate
81
+ end
82
+
83
+ failure_message_for_should do |given|
84
+ analyser = EnMasse::Dragonfly::FFMPEG::Analyser.new
85
+ "Expected audio bitrate #{bitrate}, but got #{analyser.audio_bitrate(given)}"
86
+ end
87
+
88
+ failure_message_for_should_not do |given|
89
+ analyser = EnMasse::Dragonfly::FFMPEG::Analyser.new
90
+ "Expected audio bitrate to not be #{bitrate}, but got #{analyser.audio_bitrate(given)}"
44
91
  end
45
92
  end
46
93
 
47
94
  RSpec::Matchers.define :have_audio_codec do |audio_codec|
48
95
  match do |given|
49
96
  analyser = EnMasse::Dragonfly::FFMPEG::Analyser.new
50
- analyser.audio_codec(given) == audio_codec.to_s
97
+ analyser.audio_codec(given) == audio_codec
98
+ end
99
+
100
+ failure_message_for_should do |given|
101
+ analyser = EnMasse::Dragonfly::FFMPEG::Analyser.new
102
+ "Expected audio_codec #{audio_codec}, but got #{analyser.audio_codec(given)}"
103
+ end
104
+
105
+ failure_message_for_should_not do |given|
106
+ analyser = EnMasse::Dragonfly::FFMPEG::Analyser.new
107
+ "Expected audio_codec to not be #{audio_codec}, but got #{analyser.audio_codec(given)}"
51
108
  end
52
109
  end
53
110
 
54
111
  RSpec::Matchers.define :have_audio_channels do |audio_channels|
55
112
  match do |given|
56
113
  analyser = EnMasse::Dragonfly::FFMPEG::Analyser.new
57
- analyser.audio_channels(given) == audio_channels.to_s
114
+ analyser.audio_channels(given) == audio_channels
58
115
  end
59
116
  end
60
117
 
61
118
  RSpec::Matchers.define :have_audio_sample_rate do |audio_sample_rate|
62
119
  match do |given|
63
120
  analyser = EnMasse::Dragonfly::FFMPEG::Analyser.new
64
- analyser.audio_sample_rate(given) == audio_sample_rate.to_s
121
+ analyser.audio_sample_rate(given) == audio_sample_rate
65
122
  end
66
123
  end
67
124
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dragonfly-ffmpeg
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.5
4
+ version: 0.1.6
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -13,7 +13,7 @@ date: 2012-03-20 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: dragonfly
16
- requirement: &70126800663540 !ruby/object:Gem::Requirement
16
+ requirement: &70205427880460 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '0.9'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70126800663540
24
+ version_requirements: *70205427880460
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: streamio-ffmpeg
27
- requirement: &70126800662660 !ruby/object:Gem::Requirement
27
+ requirement: &70205427879180 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ~>
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: 0.8.0
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *70126800662660
35
+ version_requirements: *70205427879180
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: rake
38
- requirement: &70126800661880 !ruby/object:Gem::Requirement
38
+ requirement: &70205427878600 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ~>
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: 0.9.2
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *70126800661880
46
+ version_requirements: *70205427878600
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: rspec
49
- requirement: &70126800660600 !ruby/object:Gem::Requirement
49
+ requirement: &70205427878020 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ~>
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: 2.6.0
55
55
  type: :development
56
56
  prerelease: false
57
- version_requirements: *70126800660600
57
+ version_requirements: *70205427878020
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: guard-rspec
60
- requirement: &70126800659740 !ruby/object:Gem::Requirement
60
+ requirement: &70205427877040 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ~>
@@ -65,10 +65,10 @@ dependencies:
65
65
  version: 0.4.2
66
66
  type: :development
67
67
  prerelease: false
68
- version_requirements: *70126800659740
68
+ version_requirements: *70205427877040
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: fuubar
71
- requirement: &70126800656980 !ruby/object:Gem::Requirement
71
+ requirement: &70205427876360 !ruby/object:Gem::Requirement
72
72
  none: false
73
73
  requirements:
74
74
  - - ! '>='
@@ -76,7 +76,7 @@ dependencies:
76
76
  version: '0'
77
77
  type: :development
78
78
  prerelease: false
79
- version_requirements: *70126800656980
79
+ version_requirements: *70205427876360
80
80
  description: FFMPEG libraries for processesing, encoding, analysing and generating
81
81
  videos with Dragonfly
82
82
  email: