streamio-ffmpeg 3.0.0 → 3.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 176d42fb71be4471958c695a6c6e1ab4d2f594a3
4
- data.tar.gz: fc053ad1763a78b2e30bd89fe54c124459ba26d6
3
+ metadata.gz: d040320bc3f959563977e37be82de8c7dcc0b6dd
4
+ data.tar.gz: f3074b7953107d34c7560efc1be4ae5ab104341d
5
5
  SHA512:
6
- metadata.gz: 16b6a964dd8bb2f9d32705fa76a15b405a33bb727b40724b57d0e9e5f4f14b029d617f9260380c269e11d2f0e8b5ac63ff1be7ae09ffbb6643f55af5579e5f25
7
- data.tar.gz: 3f8bdb44849284e9d3c57b453e0c1498b4db3463ae6e14b83c885f6441d68bbee05f324210b3175dadc033f1d7f0a5671315996724a32644a640ad819195b0c3
6
+ metadata.gz: aedc131eef3f61197c5db195f8ed3f22dbd8dff133b47f8b3cdfc9c1c64640fee671cb087011e27a3d795e95d7764d431c6212ebcd763f0fa09c993a6de8bafe
7
+ data.tar.gz: 0ceaeb9d374541e9de8d1b70623632913ff69d60a39c8482fe7a28cc9a56be5bd983a7fa4414117045791355ebd7a2aa1a6bdf402a7b76b2571c0b068b31174c
data/CHANGELOG CHANGED
@@ -1,6 +1,13 @@
1
1
  == Master
2
2
 
3
- Current with 3.0.0
3
+ Current with 3.0.1
4
+
5
+ == 3.0.1 2016-11-10
6
+
7
+ Improvements:
8
+ * Issue #144 is fixed. Of a nil movie is presented to transcode, the progress block does not fail
9
+ * Issue #145 Adds ability to follow URLs when presented as Movie inputs
10
+
4
11
 
5
12
  == 3.0.0 2016-09-07
6
13
 
data/README.md CHANGED
@@ -1,6 +1,8 @@
1
1
  Streamio FFMPEG
2
2
  ===============
3
3
 
4
+ [![Code Climate](https://codeclimate.com/github/streamio/streamio-ffmpeg/badges/gpa.svg)](https://codeclimate.com/github/streamio/streamio-ffmpeg)
5
+
4
6
  Simple yet powerful wrapper around the ffmpeg command for reading metadata and transcoding movies.
5
7
 
6
8
  All work on this project is sponsored by the online video platform [Streamio](http://streamio.com).
@@ -10,7 +12,7 @@ All work on this project is sponsored by the online video platform [Streamio](ht
10
12
  Installation
11
13
  ------------
12
14
 
13
- (sudo) gem install streamio-ffmpeg
15
+ gem install streamio-ffmpeg
14
16
 
15
17
  Compatibility
16
18
  -------------
@@ -27,13 +29,14 @@ The current gem is tested against ffmpeg 2.8.4. So no guarantees with earlier (o
27
29
  versions. Output and input standards have inconveniently changed rather a lot between versions
28
30
  of ffmpeg. My goal is to keep this library in sync with new versions of ffmpeg as they come along.
29
31
 
32
+ On macOS: `brew install ffmpeg`.
33
+
30
34
  Usage
31
35
  -----
32
36
 
33
37
  ### Require the gem
34
38
 
35
39
  ``` ruby
36
- require 'rubygems'
37
40
  require 'streamio-ffmpeg'
38
41
  ```
39
42
 
@@ -79,7 +82,7 @@ movie.transcode("movie.mp4") { |progress| puts progress } # 0.2 ... 0.5 ... 1.0
79
82
  Give custom command line options with an array.
80
83
 
81
84
  ``` ruby
82
- movie.transcode("movie.mp4", %w(-ac aac -vc libx264 -ac 2 ...)")
85
+ movie.transcode("movie.mp4", %w(-ac aac -vc libx264 -ac 2 ...))
83
86
  ```
84
87
 
85
88
  Use the EncodingOptions parser for humanly readable transcoding options. Below you'll find most of the supported options.
@@ -87,12 +90,13 @@ Note that the :custom key is an array so that it can be used for FFMpeg options
87
90
  `-map` that can be repeated:
88
91
 
89
92
  ``` ruby
90
- options = {video_codec: "libx264", frame_rate: 10, resolution: "320x240", video_bitrate: 300, video_bitrate_tolerance: 100,
91
- aspect: 1.333333, keyframe_interval: 90,
92
- x264_vprofile: "high", x264_preset: "slow",
93
- audio_codec: "libfaac", audio_bitrate: 32, audio_sample_rate: 22050, audio_channels: 1,
94
- threads: 2,
95
- custom: %w(-vf crop=60:60:10:10 -map 0:0 -map 0:1) }
93
+ options = {
94
+ video_codec: "libx264", frame_rate: 10, resolution: "320x240", video_bitrate: 300, video_bitrate_tolerance: 100,
95
+ aspect: 1.333333, keyframe_interval: 90, x264_vprofile: "high", x264_preset: "slow",
96
+ audio_codec: "libfaac", audio_bitrate: 32, audio_sample_rate: 22050, audio_channels: 1,
97
+ threads: 2, custom: %w(-vf crop=60:60:10:10 -map 0:0 -map 0:1)
98
+ }
99
+
96
100
  movie.transcode("movie.mp4", options)
97
101
  ```
98
102
 
@@ -169,7 +173,10 @@ Add watermark image on the video.
169
173
  For example, you want to add a watermark on the video at right top corner with 10px padding.
170
174
 
171
175
  ``` ruby
172
- options = { watermark: "full_path_of_watermark.png", resolution: "640x360", watermark_filter: { position: "RT", padding_x: 10, padding_y: 10 } }
176
+ options = {
177
+ watermark: "full_path_of_watermark.png", resolution: "640x360",
178
+ watermark_filter: { position: "RT", padding_x: 10, padding_y: 10 }
179
+ }
173
180
  ```
174
181
 
175
182
  Position can be "LT" (Left Top Corner), "RT" (Right Top Corner), "LB" (Left Bottom Corner), "RB" (Right Bottom Corner).
@@ -194,7 +201,7 @@ To generate multiple screenshots in a single pass, specify `vframes` and a wildc
194
201
  sure to disable output file validation. The following code generates up to 20 screenshots every 10 seconds:
195
202
 
196
203
  ``` ruby
197
- movie.screenshot("screenshot_%d.jpg", {vframes: 20, frame_rate: '1/6'}, validate: false)
204
+ movie.screenshot("screenshot_%d.jpg", { vframes: 20, frame_rate: '1/6' }, validate: false)
198
205
  ```
199
206
 
200
207
  To specify the quality when generating compressed screenshots (.jpg), use `quality` which specifies
@@ -218,20 +225,27 @@ Since there is not movie to transcode, the Transcoder class needs to be used. Th
218
225
  provided through transcoder options.
219
226
 
220
227
  ``` ruby
221
- slideshow_transcoder = FFMPEG::Transcoder.new('', 'slideshow.mp4', {resolution: "320x240"}, input: 'img_%03d.jpeg', input_options: {framerate: '1/5' })
228
+ slideshow_transcoder = FFMPEG::Transcoder.new(
229
+ '',
230
+ 'slideshow.mp4',
231
+ { resolution: "320x240" },
232
+ input: 'img_%03d.jpeg',
233
+ input_options: { framerate: '1/5' }
234
+ )
235
+
222
236
  slideshow = slideshow_transcoder.run
223
237
  ```
224
238
 
225
239
  Specify the path to ffmpeg
226
240
  --------------------------
227
241
 
228
- By default, the gem assumes that the ffmpeg binary is available in the execution path and named ffmpeg and so will run commands that look something like "ffmpeg -i /path/to/input.file ...". Use the FFMPEG.ffmpeg_binary setter to specify the full path to the binary if necessary:
242
+ By default, the gem assumes that the ffmpeg binary is available in the execution path and named ffmpeg and so will run commands that look something like `ffmpeg -i /path/to/input.file ...`. Use the FFMPEG.ffmpeg_binary setter to specify the full path to the binary if necessary:
229
243
 
230
244
  ``` ruby
231
245
  FFMPEG.ffmpeg_binary = '/usr/local/bin/ffmpeg'
232
246
  ```
233
247
 
234
- This will cause the same command to run as "/usr/local/bin/ffmpeg -i /path/to/input.file ..." instead.
248
+ This will cause the same command to run as `/usr/local/bin/ffmpeg -i /path/to/input.file ...` instead.
235
249
 
236
250
 
237
251
  Automatically kill hung processes
@@ -263,7 +277,6 @@ transcoder_options = { validate: false }
263
277
  movie.transcode("movie.mp4", options, transcoder_options) # returns nil
264
278
  ```
265
279
 
266
-
267
280
  Copyright
268
281
  ---------
269
282
 
@@ -1,4 +1,6 @@
1
1
  module FFMPEG
2
2
  class Error < StandardError
3
3
  end
4
+ class HTTPTooManyRequests < StandardError
5
+ end
4
6
  end
@@ -17,7 +17,7 @@ module FFMPEG
17
17
 
18
18
  if remote?
19
19
  @head = head
20
- raise Errno::ENOENT, "the URL '#{path}' does not exist" if @head.nil? || @head.code.to_i != 200
20
+ raise Errno::ENOENT, "the URL '#{path}' does not exist" unless @head.is_a?(Net::HTTPSuccess)
21
21
  else
22
22
  raise Errno::ENOENT, "the file '#{path}' does not exist" unless File.exist?(path)
23
23
  end
@@ -25,7 +25,7 @@ module FFMPEG
25
25
  @path = path
26
26
 
27
27
  # ffmpeg will output to stderr
28
- command = [FFMPEG.ffprobe_binary, '-i', path, *['-print_format', 'json', '-show_format', '-show_streams', '-show_error']]
28
+ command = [FFMPEG.ffprobe_binary, '-i', path, *%w(-print_format json -show_format -show_streams -show_error)]
29
29
  std_output = ''
30
30
  std_error = ''
31
31
 
@@ -132,7 +132,7 @@ module FFMPEG
132
132
  end
133
133
 
134
134
  def remote?
135
- @path =~ URI::regexp
135
+ @path =~ URI::regexp(%w(http https))
136
136
  end
137
137
 
138
138
  def local?
@@ -217,14 +217,24 @@ module FFMPEG
217
217
  output.force_encoding("ISO-8859-1")
218
218
  end
219
219
 
220
- def head
221
- url = URI(@path)
220
+ def head(location=@path, limit=FFMPEG.max_http_redirect_attempts)
221
+ url = URI(location)
222
222
  return unless url.path
223
223
 
224
224
  http = Net::HTTP.new(url.host, url.port)
225
225
  http.use_ssl = url.port == 443
226
- http.request_head(url.path)
227
- rescue SocketError, Errno::ECONNREFUSED
226
+ response = http.request_head(url.request_uri)
227
+
228
+ case response
229
+ when Net::HTTPRedirection then
230
+ raise FFMPEG::HTTPTooManyRequests if limit == 0
231
+ new_uri = url + URI(response['Location'])
232
+
233
+ head(new_uri, limit - 1)
234
+ else
235
+ response
236
+ end
237
+ rescue SocketError, Errno::ECONNREFUSED => e
228
238
  nil
229
239
  end
230
240
  end
@@ -81,8 +81,11 @@ module FFMPEG
81
81
  else # better make sure it wont blow up in case of unexpected output
82
82
  time = 0.0
83
83
  end
84
- progress = time / @movie.duration
85
- yield(progress) if block_given?
84
+
85
+ if @movie
86
+ progress = time / @movie.duration
87
+ yield(progress) if block_given?
88
+ end
86
89
  end
87
90
  end
88
91
 
@@ -1,3 +1,3 @@
1
1
  module FFMPEG
2
- VERSION = '3.0.0'
2
+ VERSION = '3.0.1'
3
3
  end
@@ -72,6 +72,24 @@ module FFMPEG
72
72
  @ffprobe_binary = bin
73
73
  end
74
74
 
75
+ # Get the maximum number of http redirect attempts
76
+ #
77
+ # @return [Integer] the maximum number of retries
78
+ def self.max_http_redirect_attempts
79
+ @max_http_redirect_attempts.nil? ? 10 : @max_http_redirect_attempts
80
+ end
81
+
82
+ # Set the maximum number of http redirect attempts.
83
+ #
84
+ # @param [Integer] the maximum number of retries
85
+ # @return [Integer] the number of retries you set
86
+ # @raise Errno::ENOENT if the value is negative or not an Integer
87
+ def self.max_http_redirect_attempts=(v)
88
+ raise Errno::ENOENT, 'max_http_redirect_attempts must be an integer' if v && !v.is_a?(Integer)
89
+ raise Errno::ENOENT, 'max_http_redirect_attempts may not be negative' if v && v < 0
90
+ @max_http_redirect_attempts = v
91
+ end
92
+
75
93
  # Cross-platform way of finding an executable in the $PATH.
76
94
  #
77
95
  # which('ruby') #=> /usr/bin/ruby
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: streamio-ffmpeg
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.0.0
4
+ version: 3.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rackfish AB
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-09-08 00:00:00.000000000 Z
11
+ date: 2016-11-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: multi_json