ffmpeg 0.2.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (154) hide show
  1. data/.gitignore +4 -0
  2. data/LICENSE +20 -0
  3. data/README.textile +45 -0
  4. data/Rakefile +45 -0
  5. data/VERSION.yml +5 -0
  6. data/features/ffmpeg.feature +9 -0
  7. data/features/steps/ffmpeg_steps.rb +0 -0
  8. data/features/support/env.rb +11 -0
  9. data/ffmpeg.gemspec +86 -0
  10. data/lib/ffmpeg.rb +121 -0
  11. data/lib/ffmpeg/audio_options.rb +47 -0
  12. data/lib/ffmpeg/class_methods.rb +18 -0
  13. data/lib/ffmpeg/ffmpeg_command.rb +25 -0
  14. data/lib/ffmpeg/file_extensions.rb +150 -0
  15. data/lib/ffmpeg/helper_methods.rb +8 -0
  16. data/lib/ffmpeg/main_options.rb +165 -0
  17. data/lib/ffmpeg/meta_data.rb +22 -0
  18. data/lib/ffmpeg/video_advanced_options.rb +275 -0
  19. data/lib/ffmpeg/video_options.rb +197 -0
  20. data/rdoc/classes/FFMpeg.html +250 -0
  21. data/rdoc/classes/FFMpeg.src/M000005.html +27 -0
  22. data/rdoc/classes/FFMpeg.src/M000006.html +29 -0
  23. data/rdoc/classes/FFMpeg.src/M000007.html +18 -0
  24. data/rdoc/classes/FFMpeg.src/M000008.html +24 -0
  25. data/rdoc/classes/FFMpeg/AudioOptions.html +269 -0
  26. data/rdoc/classes/FFMpeg/AudioOptions.src/M000093.html +18 -0
  27. data/rdoc/classes/FFMpeg/AudioOptions.src/M000094.html +18 -0
  28. data/rdoc/classes/FFMpeg/AudioOptions.src/M000095.html +18 -0
  29. data/rdoc/classes/FFMpeg/AudioOptions.src/M000096.html +18 -0
  30. data/rdoc/classes/FFMpeg/AudioOptions.src/M000097.html +18 -0
  31. data/rdoc/classes/FFMpeg/AudioOptions.src/M000098.html +18 -0
  32. data/rdoc/classes/FFMpeg/AudioOptions.src/M000099.html +18 -0
  33. data/rdoc/classes/FFMpeg/AudioOptions.src/M000100.html +18 -0
  34. data/rdoc/classes/FFMpeg/ClassMethods.html +131 -0
  35. data/rdoc/classes/FFMpeg/ClassMethods.src/M000049.html +18 -0
  36. data/rdoc/classes/FFMpeg/HelperMethods.html +131 -0
  37. data/rdoc/classes/FFMpeg/HelperMethods.src/M000074.html +19 -0
  38. data/rdoc/classes/FFMpeg/MainOptions.html +494 -0
  39. data/rdoc/classes/FFMpeg/MainOptions.src/M000075.html +18 -0
  40. data/rdoc/classes/FFMpeg/MainOptions.src/M000076.html +18 -0
  41. data/rdoc/classes/FFMpeg/MainOptions.src/M000077.html +18 -0
  42. data/rdoc/classes/FFMpeg/MainOptions.src/M000078.html +18 -0
  43. data/rdoc/classes/FFMpeg/MainOptions.src/M000079.html +18 -0
  44. data/rdoc/classes/FFMpeg/MainOptions.src/M000080.html +18 -0
  45. data/rdoc/classes/FFMpeg/MainOptions.src/M000081.html +18 -0
  46. data/rdoc/classes/FFMpeg/MainOptions.src/M000082.html +18 -0
  47. data/rdoc/classes/FFMpeg/MainOptions.src/M000083.html +18 -0
  48. data/rdoc/classes/FFMpeg/MainOptions.src/M000084.html +18 -0
  49. data/rdoc/classes/FFMpeg/MainOptions.src/M000085.html +18 -0
  50. data/rdoc/classes/FFMpeg/MainOptions.src/M000086.html +18 -0
  51. data/rdoc/classes/FFMpeg/MainOptions.src/M000087.html +18 -0
  52. data/rdoc/classes/FFMpeg/MainOptions.src/M000088.html +18 -0
  53. data/rdoc/classes/FFMpeg/MainOptions.src/M000089.html +18 -0
  54. data/rdoc/classes/FFMpeg/MainOptions.src/M000090.html +18 -0
  55. data/rdoc/classes/FFMpeg/MainOptions.src/M000091.html +18 -0
  56. data/rdoc/classes/FFMpeg/MetaData.html +151 -0
  57. data/rdoc/classes/FFMpeg/MetaData.src/M000092.html +24 -0
  58. data/rdoc/classes/FFMpeg/VideoAdvancedOptions.html +924 -0
  59. data/rdoc/classes/FFMpeg/VideoAdvancedOptions.src/M000009.html +18 -0
  60. data/rdoc/classes/FFMpeg/VideoAdvancedOptions.src/M000010.html +18 -0
  61. data/rdoc/classes/FFMpeg/VideoAdvancedOptions.src/M000011.html +18 -0
  62. data/rdoc/classes/FFMpeg/VideoAdvancedOptions.src/M000012.html +18 -0
  63. data/rdoc/classes/FFMpeg/VideoAdvancedOptions.src/M000013.html +18 -0
  64. data/rdoc/classes/FFMpeg/VideoAdvancedOptions.src/M000014.html +18 -0
  65. data/rdoc/classes/FFMpeg/VideoAdvancedOptions.src/M000015.html +18 -0
  66. data/rdoc/classes/FFMpeg/VideoAdvancedOptions.src/M000016.html +18 -0
  67. data/rdoc/classes/FFMpeg/VideoAdvancedOptions.src/M000017.html +18 -0
  68. data/rdoc/classes/FFMpeg/VideoAdvancedOptions.src/M000018.html +18 -0
  69. data/rdoc/classes/FFMpeg/VideoAdvancedOptions.src/M000019.html +18 -0
  70. data/rdoc/classes/FFMpeg/VideoAdvancedOptions.src/M000020.html +18 -0
  71. data/rdoc/classes/FFMpeg/VideoAdvancedOptions.src/M000021.html +18 -0
  72. data/rdoc/classes/FFMpeg/VideoAdvancedOptions.src/M000022.html +18 -0
  73. data/rdoc/classes/FFMpeg/VideoAdvancedOptions.src/M000023.html +18 -0
  74. data/rdoc/classes/FFMpeg/VideoAdvancedOptions.src/M000024.html +18 -0
  75. data/rdoc/classes/FFMpeg/VideoAdvancedOptions.src/M000025.html +18 -0
  76. data/rdoc/classes/FFMpeg/VideoAdvancedOptions.src/M000026.html +18 -0
  77. data/rdoc/classes/FFMpeg/VideoAdvancedOptions.src/M000027.html +18 -0
  78. data/rdoc/classes/FFMpeg/VideoAdvancedOptions.src/M000028.html +18 -0
  79. data/rdoc/classes/FFMpeg/VideoAdvancedOptions.src/M000029.html +18 -0
  80. data/rdoc/classes/FFMpeg/VideoAdvancedOptions.src/M000030.html +18 -0
  81. data/rdoc/classes/FFMpeg/VideoAdvancedOptions.src/M000031.html +18 -0
  82. data/rdoc/classes/FFMpeg/VideoAdvancedOptions.src/M000032.html +18 -0
  83. data/rdoc/classes/FFMpeg/VideoAdvancedOptions.src/M000033.html +18 -0
  84. data/rdoc/classes/FFMpeg/VideoAdvancedOptions.src/M000034.html +18 -0
  85. data/rdoc/classes/FFMpeg/VideoAdvancedOptions.src/M000035.html +18 -0
  86. data/rdoc/classes/FFMpeg/VideoAdvancedOptions.src/M000036.html +18 -0
  87. data/rdoc/classes/FFMpeg/VideoAdvancedOptions.src/M000037.html +18 -0
  88. data/rdoc/classes/FFMpeg/VideoAdvancedOptions.src/M000038.html +18 -0
  89. data/rdoc/classes/FFMpeg/VideoAdvancedOptions.src/M000039.html +18 -0
  90. data/rdoc/classes/FFMpeg/VideoAdvancedOptions.src/M000040.html +18 -0
  91. data/rdoc/classes/FFMpeg/VideoAdvancedOptions.src/M000041.html +18 -0
  92. data/rdoc/classes/FFMpeg/VideoAdvancedOptions.src/M000042.html +18 -0
  93. data/rdoc/classes/FFMpeg/VideoAdvancedOptions.src/M000043.html +18 -0
  94. data/rdoc/classes/FFMpeg/VideoAdvancedOptions.src/M000044.html +18 -0
  95. data/rdoc/classes/FFMpeg/VideoAdvancedOptions.src/M000045.html +18 -0
  96. data/rdoc/classes/FFMpeg/VideoAdvancedOptions.src/M000046.html +22 -0
  97. data/rdoc/classes/FFMpeg/VideoAdvancedOptions.src/M000047.html +18 -0
  98. data/rdoc/classes/FFMpeg/VideoAdvancedOptions.src/M000048.html +18 -0
  99. data/rdoc/classes/FFMpeg/VideoOptions.html +630 -0
  100. data/rdoc/classes/FFMpeg/VideoOptions.src/M000050.html +18 -0
  101. data/rdoc/classes/FFMpeg/VideoOptions.src/M000051.html +18 -0
  102. data/rdoc/classes/FFMpeg/VideoOptions.src/M000052.html +18 -0
  103. data/rdoc/classes/FFMpeg/VideoOptions.src/M000053.html +18 -0
  104. data/rdoc/classes/FFMpeg/VideoOptions.src/M000054.html +18 -0
  105. data/rdoc/classes/FFMpeg/VideoOptions.src/M000055.html +18 -0
  106. data/rdoc/classes/FFMpeg/VideoOptions.src/M000056.html +18 -0
  107. data/rdoc/classes/FFMpeg/VideoOptions.src/M000057.html +18 -0
  108. data/rdoc/classes/FFMpeg/VideoOptions.src/M000058.html +18 -0
  109. data/rdoc/classes/FFMpeg/VideoOptions.src/M000059.html +18 -0
  110. data/rdoc/classes/FFMpeg/VideoOptions.src/M000060.html +18 -0
  111. data/rdoc/classes/FFMpeg/VideoOptions.src/M000061.html +18 -0
  112. data/rdoc/classes/FFMpeg/VideoOptions.src/M000062.html +18 -0
  113. data/rdoc/classes/FFMpeg/VideoOptions.src/M000063.html +18 -0
  114. data/rdoc/classes/FFMpeg/VideoOptions.src/M000064.html +18 -0
  115. data/rdoc/classes/FFMpeg/VideoOptions.src/M000065.html +18 -0
  116. data/rdoc/classes/FFMpeg/VideoOptions.src/M000066.html +18 -0
  117. data/rdoc/classes/FFMpeg/VideoOptions.src/M000067.html +18 -0
  118. data/rdoc/classes/FFMpeg/VideoOptions.src/M000068.html +18 -0
  119. data/rdoc/classes/FFMpeg/VideoOptions.src/M000069.html +18 -0
  120. data/rdoc/classes/FFMpeg/VideoOptions.src/M000070.html +18 -0
  121. data/rdoc/classes/FFMpeg/VideoOptions.src/M000071.html +18 -0
  122. data/rdoc/classes/FFMpeg/VideoOptions.src/M000072.html +18 -0
  123. data/rdoc/classes/FFMpeg/VideoOptions.src/M000073.html +18 -0
  124. data/rdoc/classes/FFMpegCommand.html +176 -0
  125. data/rdoc/classes/FFMpegCommand.src/M000001.html +18 -0
  126. data/rdoc/classes/FFMpegCommand.src/M000002.html +18 -0
  127. data/rdoc/classes/FFMpegCommand.src/M000003.html +18 -0
  128. data/rdoc/classes/FFMpegCommand.src/M000004.html +22 -0
  129. data/rdoc/classes/FileExtensions.html +118 -0
  130. data/rdoc/created.rid +1 -0
  131. data/rdoc/files/README_textile.html +171 -0
  132. data/rdoc/files/lib/ffmpeg/audio_options_rb.html +101 -0
  133. data/rdoc/files/lib/ffmpeg/class_methods_rb.html +101 -0
  134. data/rdoc/files/lib/ffmpeg/ffmpeg_command_rb.html +101 -0
  135. data/rdoc/files/lib/ffmpeg/file_extensions_rb.html +101 -0
  136. data/rdoc/files/lib/ffmpeg/helper_methods_rb.html +101 -0
  137. data/rdoc/files/lib/ffmpeg/main_options_rb.html +101 -0
  138. data/rdoc/files/lib/ffmpeg/meta_data_rb.html +101 -0
  139. data/rdoc/files/lib/ffmpeg/video_advanced_options_rb.html +101 -0
  140. data/rdoc/files/lib/ffmpeg/video_options_rb.html +101 -0
  141. data/rdoc/files/lib/ffmpeg_rb.html +116 -0
  142. data/rdoc/fr_class_index.html +36 -0
  143. data/rdoc/fr_file_index.html +36 -0
  144. data/rdoc/fr_method_index.html +126 -0
  145. data/rdoc/index.html +24 -0
  146. data/rdoc/rdoc-style.css +208 -0
  147. data/spec/audio_options_spec.rb +72 -0
  148. data/spec/ffmpeg_spec.rb +161 -0
  149. data/spec/files/terminal.mpg +0 -0
  150. data/spec/meta_spec.rb +15 -0
  151. data/spec/spec_helper.rb +11 -0
  152. data/spec/video_advanced_options_spec.rb +349 -0
  153. data/spec/video_options_spec.rb +200 -0
  154. metadata +213 -0
@@ -0,0 +1,4 @@
1
+ *.sw?
2
+ .DS_Store
3
+ coverage
4
+ pkg/*
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2008 Patrik Hedman
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,45 @@
1
+ h2. FFMpeg
2
+
3
+ A DSL for building and executing ffmpeg commands.
4
+
5
+ h2. Requirements
6
+
7
+ It requires that you already have ffmpeg installed, obviously :)
8
+
9
+ h2. Install
10
+
11
+ gem install polly-ffmpeg --source http://gems.github.com
12
+
13
+ h2. Usage
14
+
15
+ To build and execute a command you would use the FFMpeg::convert method and then call the FFMpeg::run method like this:
16
+
17
+ require "rubygems"
18
+ require "ffmpeg"
19
+ include FFMpeg
20
+
21
+ convert "file.ext", :to => "new_file.ext" do
22
+ <span>&nbsp;&nbsp;&nbsp;&nbsp;seek "00:01:13"</span>
23
+ <span>&nbsp;&nbsp;&nbsp;&nbsp;duration "00:10:01"</span>
24
+ end.run
25
+
26
+ If you want the output file to have the same name as the input file it's enough to just specify the new file extension like this:
27
+
28
+ require "rubygems"
29
+ require "ffmpeg"
30
+ include FFMpeg
31
+
32
+ convert "finding_that_nemo_dude.avi", :to => :flv do
33
+ <span>&nbsp;&nbsp;&nbsp;&nbsp;...</span>
34
+ end
35
+
36
+ This will produce an output file called finding_that_nemo_dude.flv
37
+
38
+ For more information checkout the "documentation":http://polly.github.com/ffmpeg/ or my "blog":http://pastbedti.me/
39
+
40
+ h2. Credit where credit's due
41
+
42
+ Thank's to "jwthompson2":http://github.com/jwthompson2 there's now support for all of the standard video and audio options and most of the advanced video options from the ffmpeg documentation as well
43
+ as improved and refactored specs.
44
+
45
+ Thanks to "jamesdaniels":http://github.com/jamesdaniels for fixing a nasty output path error while using the :to => extension option
@@ -0,0 +1,45 @@
1
+ require 'rake'
2
+
3
+ begin
4
+ require 'jeweler'
5
+ Jeweler::Tasks.new do |s|
6
+ s.name = "ffmpeg"
7
+ s.summary = %Q{A dsl for building and executing ffmpeg commands}
8
+ s.email = "patrik@moresale.se"
9
+ s.homepage = "http://github.com/polly/ffmpeg"
10
+ s.description = "A dsl for building and executing ffmpeg commands"
11
+ s.authors = ["Patrik Hedman"]
12
+ end
13
+ rescue LoadError
14
+ puts "Jeweler not available. Install it with: sudo gem install technicalpickles-jeweler -s http://gems.github.com"
15
+ end
16
+
17
+ require 'rake/rdoctask'
18
+ Rake::RDocTask.new do |rdoc|
19
+ rdoc.rdoc_dir = 'rdoc'
20
+ rdoc.title = 'ffmpeg'
21
+ rdoc.options << '--line-numbers' << '--inline-source'
22
+ rdoc.rdoc_files.include('README*')
23
+ rdoc.rdoc_files.include('lib/**/*.rb')
24
+ end
25
+
26
+ require 'spec/rake/spectask'
27
+ Spec::Rake::SpecTask.new(:spec) do |t|
28
+ t.libs << 'lib' << 'spec'
29
+ t.spec_files = FileList['spec/**/*_spec.rb']
30
+ end
31
+
32
+ Spec::Rake::SpecTask.new(:rcov) do |t|
33
+ t.libs << 'lib' << 'spec'
34
+ t.spec_files = FileList['spec/**/*_spec.rb']
35
+ t.rcov = true
36
+ end
37
+
38
+ begin
39
+ require 'cucumber/rake/task'
40
+ Cucumber::Rake::Task.new(:features)
41
+ rescue LoadError
42
+ puts "Cucumber is not available. In order to run features, you must: sudo gem install cucumber"
43
+ end
44
+
45
+ task :default => :spec
@@ -0,0 +1,5 @@
1
+ ---
2
+ :minor: 2
3
+ :patch: 5
4
+ :major: 0
5
+ :build:
@@ -0,0 +1,9 @@
1
+ Feature: something something
2
+ In order to something something
3
+ A user something something
4
+ something something something
5
+
6
+ Scenario: something something
7
+ Given inspiration
8
+ When I create a sweet new gem
9
+ Then everyone should see how awesome I am
File without changes
@@ -0,0 +1,11 @@
1
+ $LOAD_PATH.unshift(File.dirname(__FILE__) + '/../../lib')
2
+ require 'ffmpeg'
3
+
4
+ require 'spec/expectations'
5
+
6
+ require 'test/unit/assertions'
7
+
8
+ World do |world|
9
+
10
+ world
11
+ end
@@ -0,0 +1,86 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ Gem::Specification.new do |s|
4
+ s.name = %q{ffmpeg}
5
+ s.version = "0.2.1"
6
+
7
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
8
+ s.authors = ["Patrik Hedman"]
9
+ s.date = %q{2009-08-16}
10
+ s.description = %q{A DSL for building and executing ffmpeg commands}
11
+ s.email = %q{patrik@moresale.se}
12
+ s.extra_rdoc_files = [
13
+ "LICENSE",
14
+ "README.textile"
15
+ ]
16
+ s.files = [
17
+ ".gitignore",
18
+ "LICENSE",
19
+ "README.textile",
20
+ "Rakefile",
21
+ "VERSION.yml",
22
+ "features/ffmpeg.feature",
23
+ "features/steps/ffmpeg_steps.rb",
24
+ "features/support/env.rb",
25
+ "ffmpeg.gemspec",
26
+ "lib/ffmpeg.rb",
27
+ "lib/ffmpeg/audio_options.rb",
28
+ "lib/ffmpeg/class_methods.rb",
29
+ "lib/ffmpeg/ffmpeg_command.rb",
30
+ "lib/ffmpeg/file_extensions.rb",
31
+ "lib/ffmpeg/helper_methods.rb",
32
+ "lib/ffmpeg/main_options.rb",
33
+ "lib/ffmpeg/video_advanced_options.rb",
34
+ "lib/ffmpeg/video_options.rb",
35
+ "rdoc/classes/FFMpeg.html",
36
+ "rdoc/classes/FFMpeg/AudioOptions.html",
37
+ "rdoc/classes/FFMpeg/ClassMethods.html",
38
+ "rdoc/classes/FFMpeg/HelperMethods.html",
39
+ "rdoc/classes/FFMpeg/MainOptions.html",
40
+ "rdoc/classes/FFMpeg/VideoOptions.html",
41
+ "rdoc/classes/FFMpegCommand.html",
42
+ "rdoc/classes/FileExtensions.html",
43
+ "rdoc/created.rid",
44
+ "rdoc/files/README_textile.html",
45
+ "rdoc/files/lib/ffmpeg/audio_options_rb.html",
46
+ "rdoc/files/lib/ffmpeg/class_methods_rb.html",
47
+ "rdoc/files/lib/ffmpeg/ffmpeg_command_rb.html",
48
+ "rdoc/files/lib/ffmpeg/file_extensions_rb.html",
49
+ "rdoc/files/lib/ffmpeg/helper_methods_rb.html",
50
+ "rdoc/files/lib/ffmpeg/main_options_rb.html",
51
+ "rdoc/files/lib/ffmpeg/video_options_rb.html",
52
+ "rdoc/files/lib/ffmpeg_rb.html",
53
+ "rdoc/fr_class_index.html",
54
+ "rdoc/fr_file_index.html",
55
+ "rdoc/fr_method_index.html",
56
+ "rdoc/index.html",
57
+ "rdoc/rdoc-style.css",
58
+ "spec/audio_options_spec.rb",
59
+ "spec/ffmpeg_spec.rb",
60
+ "spec/spec_helper.rb",
61
+ "spec/video_advanced_options_spec.rb",
62
+ "spec/video_options_spec.rb"
63
+ ]
64
+ s.homepage = %q{http://github.com/polly/ffmpeg}
65
+ s.rdoc_options = ["--charset=UTF-8"]
66
+ s.require_paths = ["lib"]
67
+ s.rubygems_version = %q{1.3.3}
68
+ s.summary = %q{A dsl for building and executing ffmpeg commands}
69
+ s.test_files = [
70
+ "spec/audio_options_spec.rb",
71
+ "spec/ffmpeg_spec.rb",
72
+ "spec/spec_helper.rb",
73
+ "spec/video_advanced_options_spec.rb",
74
+ "spec/video_options_spec.rb"
75
+ ]
76
+
77
+ if s.respond_to? :specification_version then
78
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
79
+ s.specification_version = 3
80
+
81
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
82
+ else
83
+ end
84
+ else
85
+ end
86
+ end
@@ -0,0 +1,121 @@
1
+ require 'ffmpeg/class_methods'
2
+ require 'ffmpeg/main_options'
3
+ require 'ffmpeg/file_extensions'
4
+ require 'ffmpeg/video_options'
5
+ require 'ffmpeg/video_advanced_options'
6
+ require 'ffmpeg/audio_options'
7
+ require 'ffmpeg/ffmpeg_command'
8
+ require 'ffmpeg/helper_methods'
9
+ require 'ffmpeg/meta_data'
10
+
11
+ module FFMpeg
12
+ include HelperMethods
13
+ include MainOptions
14
+ include VideoOptions
15
+ include VideoAdvancedOptions
16
+ include AudioOptions
17
+ include MetaData
18
+
19
+ #
20
+ # When mixed into a class, extend
21
+ # it with the ClassMethods module
22
+ #
23
+ def self.included(klass)
24
+ klass.extend ClassMethods
25
+
26
+ #
27
+ # Everytime a method is added to the
28
+ # class, check for conflicts with existing
29
+ # module methods
30
+ #
31
+ def klass.method_added(name)
32
+ check_method(name) if method_checking_enabled?
33
+ end
34
+ end
35
+
36
+ #
37
+ # Sets up an FFmpegCommand for converting files:
38
+ #
39
+ # convert "file1.ext", :to => "file2.ext" do
40
+ # seek "00:03:00"
41
+ # duration "01:10:00"
42
+ # resolution "800x600"
43
+ # end
44
+ #
45
+ def convert(from_file, to_file = {})
46
+ @from_file = from_file
47
+ FFMpegCommand << "-i #{from_file}"
48
+ begin
49
+ yield if block_given?
50
+ rescue Exception => exception
51
+ disable_method_checking!
52
+ raise exception
53
+ end
54
+
55
+ build_output_file_name(from_file, to_file[:to]) do |file_name|
56
+ FFMpegCommand << file_name
57
+ end
58
+ end
59
+
60
+ #
61
+ # Explicitly set ffmpeg path
62
+ #
63
+ def ffmpeg_path(path)
64
+ @@ffmpeg_path = path
65
+ end
66
+
67
+ #
68
+ # Runs ffmpeg
69
+ #
70
+ def run
71
+ @@ffmpeg_path ||= locate_ffmpeg
72
+ unless @@ffmpeg_path.empty?
73
+ execute_command FFMpegCommand.command(@@ffmpeg_path)
74
+ else
75
+ $stderr.puts "Couldn't locate ffmpeg, try to specify an explicit path
76
+ with the ffmpeg_path(path) method"
77
+ end
78
+ end
79
+
80
+ private
81
+
82
+ def build_output_file_name(from_file, to_file)
83
+ return if to_file.nil?
84
+ if FileExtensions::EXT.include?(to_file.to_s)
85
+ yield from_file.gsub(/#{File.extname(from_file)}$/, ".#{to_file}")
86
+ else
87
+ yield "#{to_file}"
88
+ end
89
+ end
90
+
91
+ #
92
+ # Checks if the thread local varialble 'method checking disabled'
93
+ # is true or false
94
+ #
95
+ def method_checking_enabled?
96
+ !Thread.current[:'method checking disabled']
97
+ end
98
+
99
+ #
100
+ # Turns off the method checking functionality
101
+ #
102
+ def disable_method_checking!
103
+ Thread.current[:'method checking disabled'] = true
104
+ end
105
+
106
+ #
107
+ # Tries to locate the FFmpeg executable
108
+ #
109
+ def locate_ffmpeg
110
+ ffmpeg_executable = %x[which ffmpeg].strip
111
+ end
112
+
113
+ #
114
+ # Executes FFmpeg with the specified command
115
+ #
116
+ def execute_command(cmd)
117
+ puts "Executing: #{cmd}}"
118
+ %x[#{cmd}]
119
+ puts $?.success?
120
+ end
121
+ end
@@ -0,0 +1,47 @@
1
+ module FFMpeg
2
+ module AudioOptions
3
+ # Set the number of audio frames to record.
4
+ def audio_frames(number)
5
+ FFMpegCommand << "-aframes #{number}"
6
+ end
7
+
8
+ # Set the audio sampling frequency (default = 44100 Hz).
9
+ def audio_sampling(frequency)
10
+ FFMpegCommand << "-ar #{frequency}"
11
+ end
12
+
13
+ # Set the audio bitrate in bit/s (default = 64k).
14
+ def audio_bitrate(bitrate)
15
+ FFMpegCommand << "-ab #{bitrate}"
16
+ end
17
+
18
+ # Set the number of audio channels (default = 1).
19
+ def audio_channels(number)
20
+ FFMpegCommand << "-ac #{number}"
21
+ end
22
+
23
+ # Disable audio recording.
24
+ def disable_audio
25
+ FFMpegCommand << "-an"
26
+ end
27
+
28
+ # Force audio codec to codec. Use the copy special value to specify that the raw codec data must be copied as is.
29
+ def audio_codec(codec)
30
+ FFMpegCommand << "-acodec #{codec}"
31
+ end
32
+
33
+ # Add a new audio track to the output file. If you want to specify parameters, do so before -newaudio (-acodec,
34
+ # -ab, etc..). Mapping will be done automatically, if the number of output streams is equal to the number of input
35
+ # streams, else it will pick the first one that matches. You can override the mapping using -map as usual. Example:
36
+ #
37
+ # ffmpeg -i file.mpg -vcodec copy -acodec ac3 -ab 384k test.mpg -acodec mp2 -ab 192k -newaudio
38
+ def new_audio
39
+ FFMpegCommand << "-newaudio"
40
+ end
41
+
42
+ # Set the ISO 639 language code (3 letters) of the current audio stream.
43
+ def audio_language(code)
44
+ FFMpegCommand << "-alang #{code}"
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,18 @@
1
+ module FFMpeg
2
+ module ClassMethods
3
+ def check_method(name)
4
+ print_error_message_for name if method_defined? name
5
+ end
6
+
7
+ def method_defined?(name)
8
+ FFMpeg.instance_methods.include?(name.to_s) || FFMpeg.instance_methods.include?(name.to_sym)
9
+ end
10
+ private :method_defined?
11
+
12
+ def print_error_message_for(name)
13
+ $stderr.puts "WARNING: Possible conflict with FFMpeg extension:" +
14
+ "FFMpeg##{name} already exists and will be overwritten"
15
+ end
16
+ private :print_error_message_for
17
+ end
18
+ end
@@ -0,0 +1,25 @@
1
+ module FFMpegCommand
2
+ extend self
3
+
4
+ @commands = []
5
+
6
+ def <<(cmd)
7
+ @commands << cmd
8
+ end
9
+
10
+ def add_at(cmd, pos)
11
+ @commands.insert(pos, cmd)
12
+ end
13
+
14
+ def clear
15
+ @commands.clear
16
+ end
17
+
18
+ def command(prefix="")
19
+ returning prefix.to_s do |prefix|
20
+ @commands.each do |command|
21
+ prefix << " #{command}"
22
+ end
23
+ end
24
+ end
25
+ end