首页 文章

如何在网站上传输mjpeg视频

提问于
浏览
5

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

我试过以下代码:

HTML

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

PHP(video.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发送一些请求(camerateering)时,在我刷新网站或关闭它之前,它们无法发送 . 当我直接在图像src-tag中写入文件时,转向才有效 . 但是,当然,流只能在本地网络服务器上看到 . 我现在的问题是:在公共网站上传输视频的最佳方式是什么?

问候

BlackBonjour

编辑

这里是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.')
'."\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); }

3 回答

  • 1

    我'm not sure how you send camerasterring commands, because I don't在这里看到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元素以获取新图像...您能告诉我们您如何向摄像机发送请求吗?

  • 1

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

    BlackBonjour

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

相关问题