Seit zweit Tagen versuche ich tiefer in die Programmierung von GStreamer ein zu steigen. Einfaches mit "Playbin" oder kurze Pipelines funktionieren. Doch nun habe ich versucht dieses in perl um zu setzten:
über gst-launch funktioniert das und das video wird angezeigt.
Die Ausgabe:
Doch das selbe in perl funktioniert nicht. Das heißt ich bekomme kein Bild angezeigt und das Script beendet sich nicht wenn das Video abgelaufen sein sollte.
Der Code:
Die Ausgabe:
Ich hoffe jemand kann mir weiter helfen.
Danke
Code:
gst-launch filesrc location=test.avi ! avidemux name=demux demux.audio_00 ! queue ! fakesink demux.video_00 ! queue ! decodebin ! ffmpegcolorspace ! videoscale ! xvimagesin
Die Ausgabe:
Code:
Setting pipeline to PAUSED ...
Pipeline is PREROLLING ...
Pipeline is PREROLLED ...
Setting pipeline to PLAYING ...
New clock: GstSystemClock
Got EOS from element "pipeline0".
Execution ended after 19959987232 ns.
Setting pipeline to PAUSED ...
Setting pipeline to READY ...
Setting pipeline to NULL ...
Freeing pipeline ...
Doch das selbe in perl funktioniert nicht. Das heißt ich bekomme kein Bild angezeigt und das Script beendet sich nicht wenn das Video abgelaufen sein sollte.
Der Code:
Code:
#!/usr/bin/perl
use strict;
use warnings;
use utf8;
use Glib qw(TRUE FALSE);
use GStreamer;
my $file='test.avi';
my $loop = Glib::MainLoop -> new(undef, FALSE);
GStreamer->init();
my $pipeline = GStreamer::Pipeline -> new("mypipeline");
$pipeline->get_bus()->add_watch( \&my_bus_callback, [$loop, $pipeline]);
my (
$src,$demux,
$vqueue,$vdecode,$vfilter1,$vfilter2,$vsink,
$aqueue,$asink,
) = GStreamer::ElementFactory -> make(
filesrc => "data_src",
avidemux => "data_dmux",
queue => "video_queue",
decodebin => "video_decoder",
ffmpegcolorspace => "video_collorspace",
videoscale => "video_scale",
xvimagesink => "video_sink",
queue => "audio_queue",
fakesink => "audio_sink",
);
$pipeline->add($src,$demux);
$src->link($demux);
$pipeline->add($vqueue,$vdecode,$vfilter1,$vfilter2,$vsink);
$vqueue->link($vdecode,$vfilter1,$vfilter2,$vsink);
$pipeline->add($aqueue,$asink);
$aqueue->link($asink);
$demux->signal_connect(pad_added => \&new_pad, [$vqueue,$aqueue]);
$src->set(location => $file);
$pipeline->set_state("playing");
$loop->run();
$pipeline->set_state("null");
########################################################################
sub new_pad
{
my $element=shift;
my $pad=shift;
my ($video_link_to, $audio_link_to)=@{shift()};
if($pad->get_name() eq 'video_00')
{
$pad->link($video_link_to->get_pad('sink'));
print "link ".$element->get_name()." video-pad to ".$video_link_to->get_name()."\n";
}
elsif($pad->get_name() eq 'audio_00')
{
$pad->link($audio_link_to->get_pad('sink'));
print "link ".$element->get_name()." audio-pad to ".$audio_link_to->get_name()."\n";
}
}
sub my_bus_callback
{
my $bus=shift;
my $message=shift;
my ($loop, $pipe)=@{shift()};
if ($message -> type eq "warning")
{
print STDERR $message->error()."\n";
print STDERR $message->debug()."\n";
}
elsif ($message->type eq "error")
{
print STDERR $message->error()."\n";
print STDERR $message->debug()."\n";
$loop -> quit();
}
elsif ($message->type eq "eos")
{ $loop -> quit(); }
elsif($message->type eq "state-changed")
{
my $src=$message->src()->get_name() || '[UNKNOWN]';
print qq(Object "$src" ).$message->new_state()."\n";
}
# remove message from the queue
return TRUE;
}
Die Ausgabe:
Code:
Object "audio_sink" ready
Object "video_sink" ready
Object "audio_queue" ready
Object "video_scale" ready
Object "video_collorspace" ready
Object "fakesink" ready
Object "typefind" ready
Object "video_decoder" ready
Object "video_queue" ready
Object "data_dmux" ready
Object "data_src" ready
Object "mypipeline" ready
Object "audio_queue" paused
Object "video_scale" paused
Object "video_collorspace" paused
Object "typefind" paused
Object "video_queue" paused
Object "data_dmux" paused
Object "data_src" paused
link data_dmux video-pad to video_queue
link data_dmux audio-pad to audio_queue
Object "audio_sink" paused
Object "ffdec_h2630" ready
Object "ffdec_h2630" paused
Object "fakesink" paused
Object "video_decoder" paused
Object "fakesink" ready
Object "fakesink" null
Ich hoffe jemand kann mir weiter helfen.
Danke