2015-05-02 94 views
6

我有一个写入用于在Ubuntu gstreamer的应用(管道)经由网络摄像头和帧捕获器捕捉到2个视频流,并把它们放进一个容器中的脚本:执行的Gstreamer管道脚本

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. 

我只需将其放入.sh文件并通过终端执行即可。使生活更轻松我写了一个简单的PHP代码来创建一个简单的(!)网站界面(在本地主机上运行)来控制捕获过程(开始:运行.sh文件并停止:Ctrl + c)

包括两个额外的按钮,只是测试的图像采集卡和单独的摄像头传来的数据流,看看它们连接与否:

摄像头的测试预览:

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

采集卡的测试预览:

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

这里是问题:

每次我加载页面,我按开始按钮似乎PHP执行.sh管道并立即终止(我得到这个消息在屏幕上:释放管道...... )因此,即使我尝试使用测试按钮只是为了使实时流结果相同,我也没有捕获到流(!)...

请问您可以帮助我,告诉我如何运行管道gstreamer使用这个php代码捕获的代码? (需要GStreamer的管道被终止只有当我按下“停止”按钮,应该执行按Ctrl + C函数)

更多信息:

下面是接口main.php代码(这是一个有点凌乱,关于对不起):

<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> 

,这里是为按钮和其他细节record.php:

<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> 

,只是一个简单的定时器而C被示出为在页面上适合:

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; 
    } 

回答

0

我会建议检查您的apache用户。 你说你在使用ubuntu,所以它会是“www-data”,它可能无法访问你的DISPLAY或“/ dev/video0”。

  • 尝试执行你的.sh作为一个终端www数据(可能需要能够在/ etc/passwd中shell访问www数据)

  • 一个快速和肮脏的解决办法是像普通用户一样运行你的php。从终端写:

    PHP -S 0.0.0.0:8080 -t your_directory/