- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我在 ubuntu 中为 gstreamer 应用程序(管道)编写了一个脚本,用于通过网络摄像头和图像采集卡捕获 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 代码进行捕获? (仅当我按下应该执行 Ctrl+c 功能的“停止”按钮时,才需要终止 gstreamer 管道)
更多信息:
这是界面的 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;
}
最佳答案
我建议检查您的 apache 用户。您说您使用的是 ubuntu,所以它是“www-data”,它可能无法访问您的 DISPLAY 或“/dev/video0”。
尝试在终端中将 .sh 作为 www-data 执行(您可能需要在/etc/passwd 中启用对 www-data 的 shell 访问)
一个快速但肮脏的解决方案是以普通用户身份运行您的 php。从终端写:
php -S 0.0.0.0:8080 -t 你的目录/
关于php - 在 php 代码中执行 Gstreamer 管道脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30007614/
我正在使用 Assets 管道来管理我的 Grails 3.0 应用程序的前端资源。但是,似乎没有创建 CoffeeScript 文件的源映射。有什么办法可以启用它吗? 我的 build.gradle
我有一个我想要的管道: 提供一些资源, 运行一些测试, 拆资源。 我希望第 3 步中的拆卸任务运行 不管 测试是否通过或失败,在第 2 步。据我所知 runAfter如果前一个任务成功,则只运行一个任
如果我运行以下命令: Measure-Command -Expression {gci -Path C:\ -Recurse -ea SilentlyContinue | where Extensio
我知道管道是一个特殊字符,我需要使用: Scanner input = new Scanner(System.in); String line = input.next
我再次遇到同样的问题,我有我的默认处理方式,但它一直困扰着我。 有没有更好的办法? 所以基本上我有一个运行的管道,在管道内做一些事情,并想从管道内返回一个键/值对。 我希望整个管道返回一个类型为 ps
我有三个环境:dev、hml 和 qa。 在我的管道中,根据分支,阶段有一个条件来检查它是否会运行: - stage: Project_Deploy_DEV condition: eq(varia
我有 Jenkins Jenkins ver. 2.82 正在运行并想在创建新作业时使用 Pipeline 功能。但我没有看到这个列为选项。我只能在自由式项目、maven 项目、外部项目和多配置之间进
在对上一个问题 (haskell-data-hashset-from-unordered-container-performance-for-large-sets) 进行一些观察时,我偶然发现了一个奇
我正在寻找有关如何使用管道将标准输出作为其他命令的参数传递的见解。 例如,考虑这种情况: ls | grep Hello grep 的结构遵循以下模式:grep SearchTerm PathOfFi
有没有办法不因声明性管道步骤而失败,而是显示警告?目前我正在通过添加 || exit 0 来规避它到 sh 命令行的末尾,所以它总是可以正常退出。 当前示例: sh 'vendor/bin/phpcs
我们正在从旧的 Jenkins 设置迁移到所有计划都是声明性 jenkinsfile 管道的新服务器……但是,通过使用管道,我们无法再手动清除工作区。我如何设置 Jenkins 以允许 手动点播清理工
我在 Python 中阅读了有关 Pipelines 和 GridSearchCV 的以下示例: http://www.davidsbatista.net/blog/2017/04/01/docume
我有一个这样的管道脚本: node('linux'){ stage('Setup'){ echo "Build Stage" } stage('Build'){ echo
我正在使用 bitbucket 管道进行培训 这是我的 bitbucket-pipelines.yml: image: php:7.2.9 pipelines: default:
我正在编写一个程序,其中输入文件被拆分为多个文件(Shamir 的 secret 共享方案)。 这是我想象的管道: 来源:使用 Conduit.Binary.sourceFile 从输入中读取 导管:
我创建了一个管道,它有一个应该只在开发分支上执行的阶段。该阶段还需要用户输入。即使我在不同的分支上,为什么它会卡在这些步骤的用户输入上?当我提供输入时,它们会被正确跳过。 stage('Deplo
我正在尝试学习管道功能(%>%)。 当试图从这行代码转换到另一行时,它不起作用。 ---- R代码--原版----- set.seed(1014) replicate(6,sample(1:8))
在 Jenkins Pipeline 中,如何将工件从以前的构建复制到当前构建? 即使之前的构建失败,我也想这样做。 最佳答案 Stuart Rowe 还在 Pipeline Authoring Si
我正在尝试使用 执行已定义的作业构建 使用 Jenkins 管道的方法。 这是一个简单的例子: build('jenkins-test-project-build', param1 : 'some-
当我使用 where 过滤器通过管道命令排除对象时,它没有给我正确的输出。 PS C:\Users\Administrator> $proall = Get-ADComputer -filter *
我是一名优秀的程序员,十分优秀!