wl2776 has asked for the wisdom of the Perl Monks concerning the following question:
So, this service successfully processes 3 files. Then I see only messages "add_task: uri:/add?file/name", and no output from ffmpeg. Looks like the wheels don't exit. Another question. Currently, I have partially implemented only the first processing stage (call to ffmpeg to extract an audio stream from a video clip). I would appreciate advices on how to run the second executable, which would process the produced wav file. Update I've overcome the first problem. Just added my $details = delete $heap->{cmdlinefish}; in the end of worker_closed, before call to postback.#!perl.exe use warnings; use POE qw( Wheel::Run::Win32 Filter::Line); use POE::Component::Server::HTTPServer; use POE::Component::Server::HTTPServer::Handler; use POE::Component::JobQueue; use POE::Filter::Reference; use File::Basename; use Data::Dump qw(dump); my $port=8080; my $max_tasks=3; sub _start { my ( $kernel, $heap ) = @_[ KERNEL, HEAP ]; $heap->{child2} = POE::Component::Server::HTTPServer->new( port=>$port, handlers => [ "/add" => \&add_task, "/" => \&root_handler ] ); $heap->{child2}->create_server(); POE::Component::JobQueue->spawn ( Alias => 'passive', WorkerLimit => $max_tasks, Worker => \&make_a_worker, Passive => { } );} # =========== HTTP handlers ======== sub root_handler { my $context = shift; print "\nroot_handler ===request===\n"; print "root_handler: uri: ",$context->{request}->uri,"\n"; $context->{response}->code(200); $context->{response}->content( "<HTML><BODY><H1>Hi There</H1></BODY></HTML>\n" ); return H_FINAL; } sub add_task { my $context = shift; print "\nadd_task ===request===\n"; print "add_task uri: ", $context->{request}->uri,"\n"; $context->{request}->uri=~/\/add\?(.*)/; my @job_params=($1); POE::Kernel->post( 'passive', 'enqueue', 'postback', @job_params ); $context->{response}->code(200); $context->{response}->content( "<HTML><BODY><H1>add task ".join(" ",@job_params)." </ +H1></BODY></HTML>\n" ); return H_FINAL; } # =========== JobQueue handlers ======== sub make_a_worker { my ($postback, $message) = @_; POE::Session->create( inline_states => { _start => \&worker_start, worker_child_stdout => \&worker_child_stdout, worker_closed => \&worker_closed, sig_child => \&sig_child }, args => [ @_ ] ); } sub worker_start { my ($kernel, $session, $heap, @args ) = @_[KERNEL, SESSION, HEAP, +ARG0 .. $#_]; $heap->{postback}=$args[0]; $heap->{message} =$args[1]; # file name $heap->{SessionID} = $session->ID; print " -start_message_process: ".$heap->{SessionID}."\n"; my @ffmpeg_args=("-y","-i","<input mpeg>","-acodec","pcm_s16le","- +ar","16000","-ab","16000","-ac","1","<output wav>"); $ffmpeg_args[2] =$args[1]; my ($name,$path,$suffix) = fileparse($args[1],(".mpg")); $ffmpeg_args[11]="$path\\$name.wav"; $heap->{stage}="ffmpeg"; $heap->{cmdlinefish} = POE::Wheel::Run::Win32->new( Program => "ffmpeg", ProgramArgs => \@ffmpeg_args, StdoutEvent => "worker_child_stdout", StderrEvent => "worker_child_stdout", CloseEvent => "worker_closed", StdioFilter => POE::Filter::Line->new(), # Child speaks in + lines. StderrFilter => POE::Filter::Line->new(), # Child speaks in + lines. ); } sub worker_child_stdout { my ( $heap, $preargs ) = @_[ HEAP, ARG0 ]; print "-worker_child: session ",$heap->{SessionID}," ",$preargs,"\ +n"; $heap->{results}=$preargs; } sub worker_closed { my ( $kernel, $heap ) = @_[ KERNEL, HEAP ]; my $postback=$heap->{postback}; my $results=$heap->{results}; if($heap->{stage} eq "ffmpeg") { if($results =~ /video:\d+kB audio:(\d+)kB global headers:\d+kB +/) { $results = ($1>0)?"Ok":"fail"; }else{ $results = "fail"; } } else { } $postback->(($results)); print "-worker_closed: $results\n"; } sub sig_child { my ( $heap, $sig, $pid, $exit_val ) = @_[ HEAP, ARG0, ARG1, ARG2 ] +; my $details = delete $heap->{cmdlinefish}; print " -sig_child\n"; return 0; } # ========== my @handlers = qw( _start make_a_worker ); # worker_start worker_child_stdout worker_closed root_handler add_task POE::Session->create( package_states => [ main => \@handlers ] ); POE::Kernel->run(); exit 0; __END__
|
|---|