来自使用PHP和cURL的安全摄像头的MJPEG视频流

时间:2012-02-01 07:08:15

标签: php curl web

我想要向网站广播多个自托管网络安全摄像头(Axis 2100,它们已经很老了)。这些摄像机支持MJPG格式的实时流媒体,但为了从这些摄像机流式传输视频,我必须将它们公之于众。出于安全原因,我想限制通过我的网站查看这些摄像头,我可以对用户进行身份验证。由于网络摄像头位于单独的主机上,我使用cURL和PHP登录摄像机,获取MJPG图像流,然后回显实时流以显示在网页上。

header('content-type: multipart/x-mixed-replace; boundary=--myboundary');

while (@ob_end_clean()); 
$ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, 'http://XX.XXX.XXX.XX/axis-cgi/mjpg/video.cgi?resolution=320x240'); 
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY | CURLAUTH_ANYSAFE );
    curl_setopt($ch, CURLOPT_USERPWD, 'USERNAME:PASSWORD');
    $im = curl_exec($ch);


echo $im;
curl_close($ch);

问题是当我有多个会话尝试使用同一浏览器上面的代码访问相同的php页面时,只有一个会话被加载而其余会话保持空白并最终显示500内部服务器错误。它通过多个不同的浏览器打开它时会起作用,但性能会下降。

最终,我想把它变成一个网络摄像头服务器,我可以从摄像头进行一个输入流连接并将其广播到多个客户端。

我的网站由GoDaddy在linux服务器上托管,而且我不在专用服务器上,所以我认为我不会安装任何花哨的开源视频流托管服务器。

谢谢你,对不起这么长的帖子感到抱歉。

-T.Ho

1 个答案:

答案 0 :(得分:2)

我整晚在这里遇到了同样的问题,你的详细问题描述让我弄明白了我的问题是什么。

    windows上的
  • nginx + phpFastcgi必须使用多个php-cgi.exe配置(一些respawn进程问题)......但这不是主要的事情(因为你的情况是linux ......)

主要是:

  • 从命令行运行多个简单的'WGET httpTargetImgSite' - 不重现问题 - 没问题!!!

...所以结论是服务器端必须是好的,问题原因必须是浏览器缓存相关!

如果你的php代码名为videoproxy.php

- direct browser calling of: http://serverip/videoproxy.php
- or calling some html file
<html><body><img src='videoproxy.php' /></body></html>

......会有问题。 但是这段代码不会:

<html><body><script> 
document.write("<img src='videoproxy.php?dummy=" 
               +(new Date().valueOf()) +"' />"); 
</script></body></html>

(用于保留img缓存的虚拟唯一编号)