activevlc 0.0.1 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,71 @@
1
+ module ActiveVlc::LibVlc
2
+ # This is just a hack to have the libvlc_instance released when
3
+ # the Instance class is GC'ed
4
+ class InstancePtr < FFI::ManagedStruct
5
+ layout :nothing, :pointer
6
+
7
+ def self.release(ptr)
8
+ #puts "Releasing an InstancePtr #{ptr.inspect}"
9
+ Api.libvlc_release(ptr)
10
+ end
11
+ end
12
+
13
+ class Instance
14
+ attr_reader :exit_callback, :ptr
15
+
16
+ def initialize(args = [""])
17
+ argc = args.length
18
+ @argv = args.map{ |a| FFI::MemoryPointer.from_string a}
19
+ test = FFI::MemoryPointer.new(:pointer, argc)
20
+ test.put_array_of_pointer(0, @argv)
21
+
22
+ @ptr = InstancePtr.new Api.libvlc_new(argc, test)
23
+ raise "Unable to create a libvlc_instance_t" if @ptr.null?
24
+ end
25
+
26
+ def create_media(mrl)
27
+ if mrl =~ /\A[a-z]+:\/\/.+/
28
+ m = Api.libvlc_media_new_location(@ptr, mrl)
29
+ else
30
+ m = Api.libvlc_media_new_path(@ptr, mrl)
31
+ end
32
+ raise "Unable to create a libvlc_media_t" if m.null?
33
+ Media.new(m, mrl)
34
+ end
35
+
36
+ def create_media_list
37
+ ml = Api.libvlc_media_list_new(@ptr)
38
+ raise "Unable to create a libvlc_media_list_t" if ml.null?
39
+ MediaList.new(ml)
40
+ end
41
+
42
+ def create_list_player(list = nil, player = nil)
43
+ mlp = Api.libvlc_media_list_player_new(@ptr)
44
+ raise "Unable to create a libvlc_media_list_player_t" if mlp.null?
45
+ MediaListPlayer.new(mlp, list, player)
46
+ end
47
+
48
+ def create_player(media = nil)
49
+ if media and media.is_a?(Media)
50
+ MediaPlayer.new(media)
51
+ else
52
+ MediaPlayer.new self
53
+ end
54
+ end
55
+
56
+ def wait!
57
+ Api.libvlc_wait(@ptr)
58
+ end
59
+
60
+ def at_exit(&block)
61
+ Api.libvlc_set_exit_handler(@ptr, nil, nil)
62
+ @exit_callback = block
63
+ Api.libvlc_set_exit_handler(@ptr, @exit_callback, nil)
64
+ end
65
+
66
+ def add_interface(name = nil)
67
+ Api.libvlc_add_intf(@ptr, name)
68
+ end
69
+ end
70
+
71
+ end
@@ -0,0 +1,32 @@
1
+ module ActiveVlc::LibVlc
2
+ # See InstancePtr in instance.rb
3
+ class MediaPtr < FFI::ManagedStruct
4
+ layout :nothing, :pointer
5
+
6
+ def self.release(ptr)
7
+ # puts "Releasing a MediaPtr #{ptr.inspect}"
8
+ Api.libvlc_media_release(ptr)
9
+ end
10
+ end
11
+
12
+ class Media
13
+ attr_reader :ptr, :mrl
14
+
15
+ def initialize(ptr, mrl)
16
+ @ptr = MediaPtr.new(ptr)
17
+ @mrl = mrl
18
+ end
19
+
20
+ def <<(option)
21
+ raise "option must be a String" unless option.is_a?(String)
22
+
23
+ Api.libvlc_media_add_option(@ptr, option)
24
+ self
25
+ end
26
+
27
+ def event_manager
28
+ EventManager.new Api.libvlc_media_event_manager(@ptr)
29
+ end
30
+
31
+ end
32
+ end
@@ -0,0 +1,55 @@
1
+ module ActiveVlc::LibVlc
2
+ # See InstancePtr in instance.rb
3
+ class MediaListPtr < FFI::ManagedStruct
4
+ layout :media_list, :pointer
5
+
6
+ def self.release(ptr)
7
+ # puts "Releasing an MediaListPtr"
8
+ Api.libvlc_media_list_release(ptr)
9
+ end
10
+ end
11
+
12
+ class MediaList
13
+ attr_reader :ptr
14
+
15
+ def initialize(ptr)
16
+ @ptr = MediaListPtr.new(ptr)
17
+ end
18
+
19
+ # Execute the given block with the media_list lock acquired.
20
+ def locked!
21
+ if block_given?
22
+ _lock!
23
+ res = yield
24
+ _unlock!
25
+ res
26
+ end
27
+ end
28
+
29
+ def event_manager
30
+ EventManager.new Api.libvlc_media_list_event_manager(@ptr)
31
+ end
32
+
33
+ def media=(media)
34
+ Api.libvlc_media_list_set_media(@ptr, media.ptr)
35
+ end
36
+
37
+ def <<(media)
38
+ locked! { Api.libvlc_media_list_add_media(@ptr, media.ptr) }
39
+ end
40
+
41
+ def length
42
+ locked! { Api.libvlc_media_list_count(@ptr) }
43
+ end
44
+
45
+ protected
46
+ def _lock!
47
+ Api.libvlc_media_list_lock(@ptr)
48
+ end
49
+ def _unlock!
50
+ Api.libvlc_media_list_unlock(@ptr)
51
+ end
52
+
53
+
54
+ end
55
+ end
@@ -0,0 +1,64 @@
1
+ module ActiveVlc::LibVlc
2
+ class MediaListPlayerPtr < FFI::ManagedStruct
3
+ layout :nothing, :pointer
4
+
5
+ def self.release(ptr)
6
+ # puts "Releasing a MediaListPlayerPtr #{ptr.inspect}"
7
+ Api.libvlc_media_list_player_release(ptr)
8
+ end
9
+ end
10
+
11
+ class MediaListPlayer
12
+ attr_reader :ptr, :player, :list
13
+
14
+ def initialize(ptr, media_list = nil, media_player = nil)
15
+ @ptr = MediaListPlayerPtr.new(ptr)
16
+ @list = media_list
17
+ @player = media_player
18
+
19
+ self.media_list = media_list if media_list
20
+ self.media_player = media_player if media_player
21
+ end
22
+
23
+ def media_list=(list)
24
+ if list and list.is_a?(MediaList)
25
+ @list = list
26
+ Api.libvlc_media_list_player_set_media_list(@ptr, list.ptr)
27
+ else
28
+ raise "You must provide a valid MediaList"
29
+ end
30
+ end
31
+
32
+ def event_manager
33
+ EventManager.new Api.libvlc_media_list_player_event_manager(@ptr)
34
+ end
35
+
36
+ def playing?
37
+ Api.libvlc_media_list_player_is_playing(@ptr) != 0
38
+ end
39
+
40
+ def media_player=(player)
41
+ if player.is_a?(MediaPlayer) and not playing?
42
+ raise "Player already has a media" if player.media
43
+ @player = player
44
+ Api.libvlc_media_list_player_set_media_player(@ptr, player.ptr)
45
+ end
46
+ end
47
+
48
+ def play
49
+ Api.libvlc_media_list_player_play(@ptr)
50
+ end
51
+ def pause
52
+ Api.libvlc_media_list_player_pause(@ptr)
53
+ end
54
+ def stop
55
+ Api.libvlc_media_list_player_stop(@ptr)
56
+ end
57
+ def next
58
+ Api.libvlc_media_list_player_next(@ptr)
59
+ end
60
+ def previous
61
+ Api.libvlc_media_list_player_previous(@ptr)
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,63 @@
1
+ module ActiveVlc::LibVlc
2
+ # See InstancePtr in instance.rb
3
+ class MediaPlayerPtr < FFI::ManagedStruct
4
+ layout :media_list, :pointer
5
+
6
+ def self.release(ptr)
7
+ # puts "Releasing an MediaPlayerPtr"
8
+ Api.libvlc_media_player_release(ptr)
9
+ end
10
+ end
11
+
12
+ class MediaPlayer
13
+ attr_reader :ptr, :media
14
+
15
+ def initialize(vlc_or_media)
16
+ @media = nil
17
+ if vlc_or_media.is_a?(Media)
18
+ @media = vlc_or_media
19
+ @ptr = Api.libvlc_media_player_new_from_media(vlc_or_media.ptr)
20
+ else
21
+ @ptr = Api.libvlc_media_player_new(vlc_or_media.ptr)
22
+ end
23
+ end
24
+
25
+ def event_manager
26
+ event_manger = Api.libvlc_media_player_event_manager(@ptr)
27
+ raise "Unable to get EventManager for MediaPlayer #{@ptr.inspect}" unless event_manger
28
+ EventManager.new event_manger
29
+ end
30
+
31
+ def media=(new_media)
32
+ raise "You must provide a valid Media" unless new_media and new_media.is_a?(Media)
33
+ @media = new_media
34
+ Api.libvlc_media_player_set_media(@ptr, @media.ptr)
35
+ end
36
+
37
+ def play
38
+ if_media { Api.libvlc_media_player_play @ptr }
39
+ end
40
+ def stop
41
+ if_media { Api.libvlc_media_player_stop @ptr }
42
+ end
43
+ def pause
44
+ if_media { Api.libvlc_media_player_pause @ptr}
45
+ end
46
+
47
+ def playing?
48
+ Api.libvlc_media_player_is_playing @ptr
49
+ end
50
+
51
+ def state
52
+ Api.libvlc_media_player_get_state @ptr
53
+ end
54
+
55
+ protected
56
+ def if_media
57
+ if block_given?
58
+ raise "MediaPlayer: No media set" unless @media
59
+ yield
60
+ end
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,33 @@
1
+ ##
2
+ ## libvlc.rb
3
+ ## Login : <lta@still>
4
+ ## Started on Wed Jun 12 20:46:52 2013 Lta Akr
5
+ ## $Id$
6
+ ##
7
+ ## Author(s):
8
+ ## - Lta Akr <>
9
+ ##
10
+ ## Copyright (C) 2013 Lta Akr
11
+
12
+ require "ffi"
13
+
14
+ module ActiveVlc
15
+ module LibVlc
16
+ VLC_SO_NAMES = [
17
+ 'libvlc'.freeze,
18
+ 'libvlc.so.5'.freeze
19
+ ].freeze
20
+ VLCCORE_SO_NAMES = [
21
+ 'libvlccore'.freeze,
22
+ 'libvlccore.so.5'.freeze
23
+ ].freeze
24
+ end
25
+ end
26
+
27
+ require 'activevlc/libvlc/api'
28
+ require 'activevlc/libvlc/media'
29
+ require 'activevlc/libvlc/instance'
30
+ require 'activevlc/libvlc/media_player'
31
+ require 'activevlc/libvlc/media_list'
32
+ require 'activevlc/libvlc/media_list_player'
33
+ require 'activevlc/libvlc/event_manager'
@@ -20,9 +20,11 @@ module ActiveVlc
20
20
 
21
21
  attr_reader :input, :sout
22
22
 
23
- def initialize(input_array_or_string)
23
+ def initialize(input_array_or_string = nil, &block)
24
24
  @input = Stage::Input.new(input_array_or_string)
25
- @sout = Stage::Stream.new # SOut = Stream Out
25
+ @sout = Stage::Stream.new # SOut = Stream Out
26
+
27
+ ::ActiveVlc::DSL::Stream.new(@sout).instance_eval(&block) if block_given?
26
28
  end
27
29
 
28
30
  def fragment
@@ -9,8 +9,6 @@
9
9
  ##
10
10
  ## Copyright (C) 2013 Lta Akr
11
11
 
12
- require 'debugger'
13
-
14
12
  module ActiveVlc
15
13
  module PipelineDump
16
14
  extend ActiveSupport::Concern
@@ -0,0 +1,71 @@
1
+ #
2
+ # Small note about this file code's coverage
3
+ # Since most of the code is wan in another process
4
+ # (see #run), the code coverage cannot be reported.
5
+ # This file have around 100% of test code coverage
6
+ #
7
+ module ActiveVlc
8
+ class Runner
9
+ def initialize(pipeline, *args)
10
+ @pipeline = pipeline
11
+ @args = args
12
+ end
13
+
14
+ # Nobody can escape his faith.
15
+ def stop_runner!
16
+ @running = false
17
+ end
18
+
19
+ def run(fork = false)
20
+ if fork and Process.respond_to? :fork
21
+ pid = Process.fork { _run }
22
+ Process.wait pid
23
+ else
24
+ _run
25
+ end
26
+ end
27
+
28
+ protected
29
+ # Here we setup the media/list/player/event_manager
30
+ # to run the pipeline using LibVlc. There's a big unavoidable
31
+ # hack to run synchronously / 'join' the libvlc instance.
32
+ def _run
33
+ # Preparing instance/list/player/sout fragment/event manager
34
+ @api = LibVlc::Instance.new @args
35
+ sout = @pipeline.sout.fragment
36
+ list = @api.create_media_list
37
+ player = @api.create_player
38
+ events = player.event_manager
39
+
40
+ sout.gsub!('\'', '').gsub!('"', '')
41
+
42
+ # Building the medias with the right options
43
+ medias = @pipeline.input.inputs.map do |input|
44
+ #puts sout
45
+ @api.create_media(input) << sout
46
+ end
47
+ medias.each { |media| list << media }
48
+ list_player = @api.create_list_player list, player
49
+
50
+ # Set callbacks to 'know' when the processing is over
51
+ stop_events = [
52
+ :MediaPlayerPaused,
53
+ :MediaPlayerStopped,
54
+ :MediaPlayerEndReached,
55
+ :MediaPlayerEncounteredError
56
+ ]
57
+ events.on(stop_events) { stop_runner! }
58
+
59
+ # Let's rock and roll
60
+ list_player.play
61
+
62
+ # Busy Wait loop hack to synchronize with libvlc which doesn't have
63
+ # any synchronous interface (due to it's profound asynchronous nature)
64
+ @running = true
65
+ while @running
66
+ sleep 0.5
67
+ end
68
+ end
69
+
70
+ end
71
+ end
@@ -22,6 +22,7 @@ module ActiveVlc::Stage
22
22
 
23
23
  @inputs = [array_or_string] if array_or_string.is_a? String
24
24
  @inputs ||= array_or_string
25
+ @inputs ||= []
25
26
  end
26
27
 
27
28
  def <<(new_inputs)
@@ -0,0 +1,11 @@
1
+ module ActiveVlc
2
+ def self.pipe(inputs = nil, &block)
3
+ ActiveVlc::Pipeline.new(inputs, &block)
4
+ end
5
+ def self.pipe_for(inputs = nil, &block)
6
+ self.pipe(inputs, &block)
7
+ end
8
+ def self.parse(path)
9
+ ActiveVlc::Pipeline.parse(path)
10
+ end
11
+ end
@@ -1,3 +1,3 @@
1
1
  module ActiveVlc
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.3"
3
3
  end
data/lib/activevlc.rb CHANGED
@@ -1,7 +1,10 @@
1
+ module ActiveVlc
2
+ end
3
+
1
4
  require 'active_support'
2
5
  require 'activevlc/version'
3
6
  require 'activevlc/pipeline'
4
7
  require 'activevlc/dsl'
5
-
6
- module ActiveVlc
7
- end
8
+ require 'activevlc/libvlc'
9
+ require 'activevlc/runner'
10
+ require 'activevlc/syntactic_sugar'
@@ -0,0 +1,81 @@
1
+ require "spec_helper"
2
+
3
+ describe ActiveVlc::LibVlc::EventManager do
4
+ let(:vlc) { ActiveVlc::LibVlc::Instance.new [' ', '--play-and-exit'] }
5
+ let(:media) { vlc.create_media 'file:///tmp/test.mp4' }
6
+ let(:media2) { vlc.create_media '/tmp/test2.mp4' }
7
+ let(:player) { vlc.create_player }
8
+ let(:list) do
9
+ l = vlc.create_media_list
10
+ l << media
11
+ l << media2
12
+ l
13
+ end
14
+ let(:list_player) do
15
+ lp = vlc.create_list_player
16
+ lp.media_list = list
17
+ lp
18
+ end
19
+ let(:player_event) { player.event_manager }
20
+ let(:list_player_event) { list_player.event_manager }
21
+
22
+ it 'can be created' do
23
+ media.event_manager.should be_a_kind_of(ActiveVlc::LibVlc::EventManager)
24
+ list.event_manager.should be_a_kind_of(ActiveVlc::LibVlc::EventManager)
25
+ player.event_manager.should be_a_kind_of(ActiveVlc::LibVlc::EventManager)
26
+ list_player.event_manager.should be_a_kind_of(ActiveVlc::LibVlc::EventManager)
27
+ end
28
+
29
+ it 'registers and stores callbacks' do
30
+ event1 = ActiveVlc::LibVlc::Api::EventType[:MediaListPlayerStopped]
31
+ event2 = ActiveVlc::LibVlc::EventManager::EventType[:MediaListPlayerPlayed]
32
+ list_player_event.callbacks.keys.length.should eq(0)
33
+ list_player_event.on(event1) {}
34
+ list_player_event.on(event2) {}
35
+ list_player_event.on(:MediaListPlayerNextItemSet) {}
36
+ # For some reason the 'Played' event is invalid :-/ and the Stopped event
37
+ # is only triggered on very recent versions ...
38
+ list_player_event.callbacks.keys.length.should be >= 1
39
+ list_player.play
40
+ end
41
+
42
+ it 'MediaPlayer\'s EventManger receives events' do
43
+ first_event = ActiveVlc::LibVlc::Api::EventType[:MediaPlayerMediaChanged]
44
+ last_event = ActiveVlc::LibVlc::Api::EventType[:MediaPlayerVout]
45
+ (first_event..last_event).to_a.each { |e| player_event.on(e) {} }
46
+ player.media = media
47
+ player_event.events_received.should eq(1)
48
+ player.play
49
+ sleep 0.25 # Avoid random deadlock in vlc :-/ and gives some time for vlc to run
50
+ player.stop
51
+ player_event.events_received.should eq(5)
52
+ end
53
+
54
+ it 'MediaListPlayer\'s EventManger receives events' do
55
+ list_player_event.on(:MediaListPlayerNextItemSet) {}
56
+ list_player_event.on(:MediaListPlayerStopped) {}
57
+ list_player.play
58
+ list_player.stop
59
+ list_player_event.events_received.should be >= 1
60
+ end
61
+
62
+ it 'calls registered callback' do
63
+ @cbk1_called = false
64
+ list_player_event.on(:MediaListPlayerNextItemSet) { @cbk1_called = true }
65
+ list_player.play
66
+ list_player.stop
67
+ @cbk1_called.should be_true
68
+ end
69
+
70
+ it 'MediaPlayer receives event when assigned as MediaListPlayer\' player' do
71
+ first_event = ActiveVlc::LibVlc::Api::EventType[:MediaPlayerMediaChanged]
72
+ last_event = ActiveVlc::LibVlc::Api::EventType[:MediaPlayerVout]
73
+ (first_event..last_event).to_a.each { |e| player_event.on(e) {} }
74
+ list_player.media_player = player
75
+ list_player.play
76
+ sleep 0.25
77
+ list_player.stop
78
+ player_event.events_received.should eq(5)
79
+ end
80
+
81
+ end
@@ -0,0 +1,93 @@
1
+
2
+ require 'spec_helper'
3
+
4
+ describe ActiveVlc::LibVlc do
5
+ describe "Low-level binding" do
6
+ it 'binds C functions' do
7
+ [ :new, :release, :retain, :add_intf, :wait, :set_user_agent,
8
+ :get_version, :get_compiler, :free, :set_exit_handler ].each do |sym|
9
+ ActiveVlc::LibVlc::Api.respond_to?("libvlc_#{sym}")
10
+ .should be_true
11
+ end
12
+ end
13
+
14
+ it 'create a libvlc instance' do
15
+ vlc = ActiveVlc::LibVlc::Api.libvlc_new(0, nil)
16
+ vlc.null?.should be_false
17
+ end
18
+
19
+ it 'reports libvlc version' do
20
+ ActiveVlc::LibVlc::Api.libvlc_get_version.should match(/\d\.\d+\.\d+/)
21
+ ActiveVlc::LibVlc.version.should match(/\d\.\d+\.\d+/)
22
+ ActiveVlc::LibVlc.compiler.should match(/\d\.\d+\.\d+/)
23
+ end
24
+ end
25
+
26
+ describe 'Ruby wrapper: Instance/MediaXXX/EventManger creation' do
27
+ let(:vlc) { ActiveVlc::LibVlc::Instance.new [' ', '--play-and-exit'] }
28
+ let(:media) { vlc.create_media 'file:///tmp/test.mp4' }
29
+ let(:media2) { vlc.create_media '/tmp/test2.mp4' }
30
+ let(:list) { vlc.create_media_list }
31
+ let(:list_player) { vlc.create_list_player }
32
+
33
+ it 'can creates an instance' do
34
+ vlc.should be_a_kind_of(ActiveVlc::LibVlc::Instance)
35
+ vlc.ptr.null?.should be_false
36
+ end
37
+
38
+ it 'can creates a Media from an Instance using an MRL' do
39
+ media.should be_a_kind_of(ActiveVlc::LibVlc::Media)
40
+ media.ptr.null?.should be_false
41
+ end
42
+
43
+ it 'can creates a Media from an Instance using a path' do
44
+ media_from_path = vlc.create_media('/tmp/pwet')
45
+ media_from_path.should be_a_kind_of(ActiveVlc::LibVlc::Media)
46
+ media_from_path.ptr.null?.should be_false
47
+ end
48
+
49
+ it 'can set an option on a Media' do
50
+ media << ":sout='#display'"
51
+ expect { media << 42 }.to raise_error
52
+ end
53
+
54
+ it 'can creates a MediaList from an Instance' do
55
+ list.should be_a_kind_of(ActiveVlc::LibVlc::MediaList)
56
+ list.ptr.null?.should be_false
57
+ end
58
+
59
+ it 'allows setting media of a media list' do
60
+ list << media2
61
+ list.media = media
62
+ list.length.should eq(1)
63
+ end
64
+
65
+ it 'allows adding media to a MediaList' do
66
+ list << media
67
+ list << media2
68
+ list.length.should eq(2)
69
+ end
70
+
71
+ it 'allows the creation of a MediaListPlayer' do
72
+ list_player.should be_a_kind_of(ActiveVlc::LibVlc::MediaListPlayer)
73
+ list_player.ptr.null?.should be_false
74
+ list << media
75
+ list_player.media_list = list
76
+ expect {list_player.media_list = nil}.to raise_error
77
+ end
78
+
79
+ it 'allows creation of a MediaPlayer with an Instance' do
80
+ player = vlc.create_player
81
+ player.should be_a_kind_of(ActiveVlc::LibVlc::MediaPlayer)
82
+ player.ptr.null?.should be_false
83
+ end
84
+
85
+ it 'allows creation of a MediaPlayer with a Media' do
86
+ player = vlc.create_player media
87
+ player.should be_a_kind_of(ActiveVlc::LibVlc::MediaPlayer)
88
+ player.ptr.null?.should be_false
89
+ player.media.should be_a_kind_of(ActiveVlc::LibVlc::Media)
90
+ player.media.should be(media)
91
+ end
92
+ end
93
+ end
@@ -71,7 +71,7 @@ describe ActiveVlc::Pipeline do
71
71
 
72
72
  describe '\'duplicate_then_transcode\' pipeline' do
73
73
  it 'is loaded' do
74
- ActiveVlc::Pipeline.parse('spec/pipes/duplicate_then_transcode.rb').class
74
+ ActiveVlc::Pipeline::parse('spec/pipes/duplicate_then_transcode.rb').class
75
75
  .should be(ActiveVlc::Pipeline)
76
76
  end
77
77
 
@@ -81,4 +81,23 @@ describe ActiveVlc::Pipeline do
81
81
  end
82
82
  end
83
83
 
84
+ describe '\'no_input\' pipeline' do
85
+ it "is loaded" do
86
+ ActiveVlc::parse('spec/pipes/no_input.rb').class
87
+ .should be(ActiveVlc::Pipeline)
88
+ end
89
+
90
+ it 'produce the correct fragment' do
91
+ expect(ActiveVlc::parse('spec/pipes/no_input.rb').fragment)
92
+ .to eq(" :sout=\"#transcode{acodec=vorbis}:standard{mux=ogg, dst='output.ogg'}\"")
93
+ end
94
+
95
+ it 'can be assigned inputs' do
96
+ pipe = ActiveVlc::parse('spec/pipes/no_input.rb')
97
+ pipe.input << "input.mp4"
98
+ pipe.input << "input2.mp4"
99
+ pipe.fragment.should eq("input.mp4 input2.mp4 :sout=\"#transcode{acodec=vorbis}:standard{mux=ogg, dst='output.ogg'}\"")
100
+ end
101
+ end
102
+
84
103
  end
@@ -0,0 +1,20 @@
1
+ ##
2
+ ## no_input.rb
3
+ ## Login : <lta@still>
4
+ ## Started on Wed Jun 12 14:45:36 2013 Lta Akr
5
+ ## $Id$
6
+ ##
7
+ ## Author(s):
8
+ ## - Lta Akr <>
9
+ ##
10
+ ## Copyright (C) 2013 Lta Akr
11
+
12
+ ActiveVlc::pipe do
13
+ transcode do
14
+ audio :vorbis
15
+ end
16
+ to(:file) do
17
+ mux :ogg
18
+ dst 'output.ogg'
19
+ end
20
+ end