2015-05-02 37 views
6

mam napisany skrypt dla aplikacji gstreamer (rurociągu) w Ubuntu do fotografowania 2 strumienie wideo za pośrednictwem kamery internetowej i frame grabber i umieścić je w jednym pojemniku:Wykonywanie skryptu rurociąg Gstreamer kodem php

gst-launch -e mpegtsmux name="muxer" ! filesink location=TestHDMainCamera.ts \ 
v4l2src device="/dev/video1" ! video/x-raw-yuv, width=1280 ,height=720, \ 
    framerate=30/1 ! videorate ! ffmpegcolorspace ! x264enc ! muxer. \ 
v4l2src device="/dev/video0" ! video/x-raw-yuv, width=1024 ,height=768, \ 
framerate=30/1 ! x264enc ! muxer. pulsesrc \ 
device="alsa_input.usb-046d_Logitech_Webcam_C930e_AAF8A63E-02-C930e.analog-stereo" \ 
    ! audioconvert ! lamemp3enc target=1 cbr=true ! muxer. 

I po prostu umieść go w pliku .sh i uruchom go za pomocą terminala. aby ułatwić życie, napisałem prosty kod php, aby utworzyć prosty (!) interfejs strony (uruchomiony na lokalnym hoście), aby kontrolować proces przechwytywania (start: uruchom plik .sh i zatrzymaj: Ctrl + c)

w tym dwa dodatkowe przyciski po prostu przetestować strumienie pochodzące z frame grabber i kamery osobno, aby sprawdzić, czy są one połączone lub nie:

test Podgląd z kamery:

gst-launch v4l2src device=/dev/video1 ! ffmpegcolorspace ! xvimagesink 

test Podgląd framegrabber:

gst-launch v4l2src device=/dev/video0 ! ffmpegcolorspace ! xvimagesink 

Oto pytanie:

Za każdym razem, gdy ładuję stronę i naciskam przycisk Start, wydaje się, że php wykonuje potok .sh i natychmiast je kończy (pojawia się komunikat na ekranie: Freeing pipeline ... Dlatego nie otrzymuję przechwyconego strumienia (!), nawet jeśli spróbuję użyć przycisków testowych, aby uzyskać wynik transmisji na żywo jest taki sam ...

czy możesz mi pomóc i powiedzieć, jak mogę uruchomić potok kod dla gstreamer do przechwytywania przy użyciu tego kodu php? (GStreamer rurociąg musi zostać rozwiązana tylko po naciśnięciu przycisku, który powinien wykonać funkcję Ctrl + c „stop”)

Więcej informacji:

Oto kod main.php dla interfejsu (jest trochę bałagan, przepraszam):

<html> 
<head> 
    <title>PHP Test</title> 
</head> 
<body> 
<?php 
echo '<p>Hello</p>'; 
print_r($_GET); 

if (isset($_GET['action'])) { 
switch ($_GET['action']) { 
    case 'Test Webcam': 
     testWebcam(); 
     break; 
    case 'Test Framegrabber': 
     testFramegrabber(); 
     break; 
} 
} 

function testFramegrabber() { 
echo "The Test Framegrabber function is called."; 
$output = shell_exec('ls -lart'); 
echo "<pre>$output</pre>"; 
} 

function testWebcam() { 
echo "The Test Webcam function is called."; 
$output = shell_exec('ls -lart'); 
echo "<pre>$output</pre>"; 
} 

//$output = shell_exec('ls -lart'); 
//echo "<pre>$output</pre>"; 
?> 
<form action="main.php"> 
    <input type="submit" class="button" name="action" value="Test Webcam" /> 
<input type="submit" class="button" name="action" value="Test  Framegrabber" /> 
</form> 
</body> 
</html> 

i tutaj jest record.php do przycisków i innych szczegółów:

<html> 
<head> 
<title>Recording page</title> 
<link rel="stylesheet" type="text/css"  href="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css"> 

<script type="text/javascript"> 
var w = null; // initialize variable 

//function to start the timer 
function startTimer() 
{ 
// First check whether Web Workers are supported 
if (typeof(Worker)!=="undefined"){ 
    // Check whether Web Worker has been created. If not, create a new Web  Worker based on the Javascript file simple-timer.js 
    if (w==null){ 
     w = new Worker("simple-timer.js"); 
    } 
    // Update timer div with output from Web Worker 
    w.onmessage = function (event) { 
     document.getElementById("timer").innerHTML = event.data; 
    }; 
} else { 
    // Web workers are not supported by your browser 
    document.getElementById("timer").innerHTML = "Sorry, your browser does  not support Web Workers ..."; 
} 
} 

//function to stop the timer 
function stopTimer() 
{ 
w.terminate(); 
timerStart = true; 
w = null; 
} 

function handleTimer() { 
    document.getElementById("timerp").innerHTML = "start timer"; 
} 
</script> 
</head> 
<body> 
<?php 
echo '<p>Hello</p>'; 
print_r($_GET); 

if (isset($_GET['action'])) { 
    switch ($_GET['action']) { 
     case 'Test Webcam': 
      testWebcam(); 
      break; 
     case 'Test Framegrabber': 
      testFramegrabber(); 
      break; 
     case 'Record': 
      record(); 
      break; 
    } 
} 

function testFramegrabber() { 
    echo "The Test Framegrabber function is called."; 
    $output = shell_exec('ls -lart'); 
    echo "<pre>$output</pre>"; 
} 

function testWebcam() { 
    echo "The Test Webcam function is called."; 
    $output = shell_exec('ls -lart'); 
    echo "<pre>$output</pre>"; 
} 

function record(){ 
echo "The Record function is called."; 
echo "<script> startTimer(); </script>"; 
} 
function stop(){ 
    echo "The Stop function is called."; 
    echo "<script> stopTimer(); </script>"; 
} 
//$output = shell_exec('ls -lart'); 
//echo "<pre>$output</pre>"; 
?> 
<div class="header">A simple timer:</div> 

    <div class="timer" id="timer">00:00</div> 
    <div class="buttons"> 
     <button onclick="startTimer()" id="button1">Start</button> 
     <button onclick="stopTimer()" id = "button2">Stop</button> 
    </div> 
<form class="form-horizontal" action="record.php"> 
<fieldset> 

<!-- Form Name --> 
<legend>Sreen recorder</legend> 

<table class="tg" width="100%"> 
    <tr> 
    <th class="tg-031e"></th> 
    <th class="tg-031e">fdsfs</th> 
    </tr> 
    <tr> 
    <td class="tg-031e"></td> 
    <td class="tg-031e"></td> 
    <td class="tg-031e"></td> 
    </tr> 
    <tr> 
    <td class="tg-031e"></td> 
    <td class="tg-031e"></td> 
    <td class="tg-031e"></td> 
    </tr> 
    <tr> 
    <td class="tg-031e"> 
     <!-- Button --> 
     <div class="control-group"> 
     <label class="control-label" for="recordbtn"></label> 
     <div class="controls"> 
     <button id="recordbtn" name="action" class="btn btn-danger"  value="Record" onclick="startTimer()">Record</button> 
     </div> 
     </div> 
    </td> 
    <td class="tg-031e"> 
     <!-- Button --> 
     <div class="control-group"> 
     <label class="control-label" for="stopbtn"></label> 
     <div class="controls"> 
     <button id="stopbtn" name="action" class="btn btn-inverse"  value="Stop" onclick="stopTimer()">Stop</button> 
     </div> 
     </div> 
    </td> 
    <td class="tg-031e"> 
     <!-- Button --> 
     <div class="control-group"> 
     <label class="control-label" for="nextbtn"></label> 
     <div class="controls"> 
     <button id="nextbtn" name="action" class="btn btn-inverse">Next  recording</button> 
     </div> 
     </div> 
    </td> 
    </tr> 
</table> 



<!-- Button --> 
<div class="control-group"> 
<label class="control-label" for="webcamTest"></label> 
<div class="controls"> 
<button id="webcamTest" name="action" value="Test Webcam" class="btn  btn-info">Test Webcam</button> 
</div> 
</div> 

<!-- Button --> 
<div class="control-group"> 
<label class="control-label" for="testFramegrabber"></label> 
<div class="controls"> 
<button id="testFramegrabber" name="action" value="Test Framegrabber"  class="btn btn-info">Test Framegrabber</button> 
</div> 
</div> 

<!-- Select Basic --> 
<div class="control-group"> 
<label class="control-label" for="recordPath">Path to record</label> 
<div class="controls"> 
<select id="recordPath" name="recordPath" class="input-xlarge"> 
<option>/desktop</option> 
<option>/home/var</option> 
</select> 
</div> 
</div> 



</fieldset> 
</form> 
</body> 
</html> 

i tylko prosty czasomierz być wyświetlane podczas c konfigurowanie na stronie:

var timerStart = true; 

function myTimer(d0) 
{ 
    // get current time 
    var d=(new Date()).valueOf(); 
    // calculate time difference between now and initial time 
    var diff = d-d0; 
    // calculate number of minutes 
    var minutes = Math.floor(diff/1000/60); 
    // calculate number of seconds 
    var seconds = Math.floor(diff/1000)-minutes*60; 
    var myVar = null; 
    // if number of minutes less than 10, add a leading "0" 
    minutes = minutes.toString(); 
    if (minutes.length == 1){ 
     minutes = "0"+minutes; 
    } 
    // if number of seconds less than 10, add a leading "0" 
    seconds = seconds.toString(); 
    if (seconds.length == 1){ 
     seconds = "0"+seconds; 
    } 

    // return output to Web Worker 
    postMessage(minutes+":"+seconds); 
} 

if (timerStart){ 
    // get current time 
    var d0=(new Date()).valueOf(); 
    // repeat myTimer(d0) every 100 ms 
    myVar=setInterval(function(){myTimer(d0)},100); 
    // timer should not start anymore since it has been started 
    timerStart = false; 
    } 

Odpowiedz

0

Polecam sprawdzenie użytkownika apache. Mówisz, że używasz ubuntu, więc będzie to "www-data", które prawdopodobnie nie będzie miało dostępu do twojego DISPLAY ani "/ dev/video0".

  • Spróbuj wykonać jak ty SH www-danych w terminalu (może być konieczne, aby umożliwić dostęp do powłoki www-data/etc/passwd)

  • Jeden szybki i brudny rozwiązaniem byłoby uruchamianie twojego php jako zwykły użytkownik. Od terminala napisz:

    php -S 0.0.0.0:8080 -t your_directory/