7

我在网站上播放 mjpeg 视频时遇到了一些问题。摄像头有一个私有 IP(必须保持私有/本地),但必须在公共网站上可见。

我尝试了以下代码:

HTML

<img src="video.php?ip=IPADDRESS&name=NAME" width="640" height="480" />

PHP (视频.php)

<?php
    // ... some code to get the camera object
    header('Content-Type: multipart/x-mixed-replace; boundary=myboundary');
    ob_end_flush();
    readfile('http://'.$cam->user.':'.$cam->pwd.'@'.$cam->ip.'/mjpg/video.mjpg');
?>

到目前为止有效。但现在的问题是,当我通过 jQuery 发送一些请求(摄像头)时,直到我刷新网站或关闭它才能发送它们。仅当我将文件直接写入图像 src-tag 时,转向才有效。但是,当然,该流仅在本地网络服务器上可见。我现在的问题是:在公共网站上流式传输视频的最佳方式是什么?

问候

黑卓悦

编辑

这里的jQuery代码:

$('#container').on('click', '.steer', function()
{
    $.post('handle_post.php',
    {
        action: 'move-cam',
        ip: $('#camIP').val(),
        name: $('#camNAME').val(),
        move: $(this).attr('alt')
    });
});

这不是完整的代码,但这就是转向功能的全部内容。

更新 17.09

我在最后几天解决了我的问题,但仍然没有得到解决方案。我试图打开一个新窗口,它负责转向。问题是,如果我用 javascript 打开窗口,我仍然无法控制相机。当我打开不同的浏览器并直接访问“控制器”时,我可以控制相机。但这不是我想要的。如何使用 JS (Ajax) 控制相机?

接下来是,当我阅读流扔 php 时,服务器和我的电脑变得非常慢。我该如何解决?

我使用以下代码来读取流:

$fp = fsockopen($cam->ip, 80, $errno, $errstr, 30);

if(!$fp)
{
    echo $errstr.' ('.$errno.')<br />'."\n";
}
else
{
    $urlstring = "GET /mjpg/video.mjpg HTTP/1.0\r\nAuthorization: BASIC ".base64_encode($cam->user.':'.$cam->pwd)."\r\n\r\n";

    fputs($fp, $urlstring);

    while($str = trim(fgets($fp, 4096)))
    {
        header($str);
    }

    fpassthru($fp);
    flush();
    fclose($fp);
}
4

3 回答 3

2

我找到了解决方案。问题是,我在 video.php 中使用了 session_start() ,这阻止了对那些也使用相同会话的人的所有请求。就这样。
最好的祝福

黑卓悦

于 2013-09-17T11:50:28.670 回答
1

我不确定您如何发送 camerasterring 命令,因为我在这里看不到 javascript 代码。无论如何,我在这里为您的案例找到了一个很好的方法(https://github.com/wilhelmbot/Paparazzo.js):

JS:

// JavaScript example using jQuery

// Active camera will refresh every 2 seconds
var TIMEOUT = 2000;
var refreshInterval = setInterval(function() {
  var random = Math.floor(Math.random() * Math.pow(2, 31));
  $('img#camera').attr('src', 'video.php?r=' + random);//send a random var to avoid cache
}, TIMEOUT); 

html:

<img id="camera" src="video.php" width="640" height="480" />

此代码仅用于刷新 img 元素以获得新图像...您能告诉我们您如何向相机发送请求吗?

于 2013-09-13T07:26:28.997 回答
0

您还可以使用“更简单”的 NGINX 解决方案来代理您的请求,这可以说是性能更高的。以下(调整后的)对我有用:

server {
    listen 80;
    server_name [HOST];

    location /video.php {
        proxy_buffering off;
        proxy_set_header Authorization "Basic [KEY]";
        proxy_pass http://[HOST]/mjpg/video.mjpg?$query_string;
    }
}
于 2014-05-24T10:02:07.990 回答