shell — выполнение конвейерного скрипта Gstreamer в коде php

У меня есть сценарий для приложения gstreamer (конвейер) в Ubuntu для захвата 2 видеопотоков через веб-камеру и фрейм-граббер и помещения их в один контейнер:

 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

Тестовый просмотр FrameGrabber:

  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>

и просто простой таймер, который будет показан при захвате на странице:

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

6

Решение

Я бы порекомендовал проверить ваш пользователь Apache.
Вы говорите, что используете Ubuntu, так что это будет «www-data», который, вероятно, не может получить доступ ни к вашему DISPLAY, ни к «/ dev / video0».

  • Попробуйте запустить ваш .sh как www-данные в терминале (вам может потребоваться включить доступ оболочки к www-данным в / etc / passwd)

  • Одним из быстрых и грязных решений будет запуск вашего php как обычного пользователя. С терминала напишите:

    php -S 0.0.0.0:8080 -t your_directory /

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]