将图像/视频流嵌入网页

Posted

技术标签:

【中文标题】将图像/视频流嵌入网页【英文标题】:Embedding Image/Video Stream into webpage 【发布时间】:2014-11-29 10:56:47 【问题描述】:

我正在尝试创建一个 PHP 网页,让访问者可以看到来自网络摄像头的 视频流图像 不允许访问者获取它的原始 URL/URI。 换句话说,我有一个在给定地址运行的网络摄像机:端口,我可以看到嵌入在 html 正文中的流,如下所示:

    <img src="http://5.246.77.89:8080/videostream.cgi?user=myusername&amp;pwd=mypass&amp;resolution=32&amp;rate=15" >

或者如果我们想要静态图像:

    <img src="http://5.246.77.89:8080/snapshot.cgi?user=myusername&amp;pwd=mypass&amp" >

现在的问题是,如果有人查看页面后面的 HTML 代码,显然会看到摄像头的 URL 及其用户/密码凭据。这允许访问者随时连接到相机,即使无需访问托管此服务的页面,他们只需在任何浏览器中输入 URL

http://myip:myport/videostream.cgi?user=admin&amp;pwd=fewf2d53BVH&amp;resolution=32&amp;rate=15

我不希望用户能够这样做。所以我有了一个想法:如果我能够将流包装到一个充当“中间人”的 php 网页中,我可以在不让访问者知道原始来源的情况下向访问者提供视频。原始 IP:PORT 仅在我的服务器上可见。显然,他们将始终能够使用我网页的 URL,但他们永远不会看到相机的用户/密码,我可以随时锁定服务。 此外,为了提高安全性,我可以将托管网络摄像头的路由器设置为仅接受来自我的网络服务器的连接。这将对试图直接连接到 webcabm 的恶意用户起到隐蔽作用。 我可以在服务器端做什么来获得这种行为?

【问题讨论】:

只要您需要通过 GET 参数发送您的登录数据,就没有什么可以做的,因为它本质上是开放给每个人看的。我首先想到的是制作一个生成和输出图像的 php 页面(例如,使用 GD。更多信息在这里:php.net/manual/en/ref.image.php)然后执行类似 之类的操作。但是这个解决方案似乎有点......无论如何对我来说都是残废的。我认为检查 cgi 以确定是否可以通过其他方式传递登录凭据是个好主意。 @SamBraslavskiy 感谢您的反馈。然而,让我强调一下,问题不在于 HTTP 传输的安全性,因为 GET 的性质是不可能的。我不想那样。我只是想让用户在我决定这样做之后无法继续观看视频。我的想法是将视频嵌入到让您无需提供用户名和密码即可观看视频的内容中,这将使任何暴力破解尝试无效。 能否请您指定是否只需要来自相机、视频或两者的图像? @SamBraslavskiy 我愿意有两个单独的脚本,一个用于视频,一个用于图片。然而,它们呈现给主机的方式始终相同 页面之间的唯一变化将是源 CGI:videostream.cgi 用于视频,snapshot.cgi 用于图片。我想解决方案只是将页面从原始 URL 接收到的相同数据流出来。 更新:PHP 函数 passthru 似乎很有希望...... 【参考方案1】:

使用上述 passthru 的另一种解决方案:

<?php 
Header("content-type:image/jpeg"); 
passthru("pic.jpg?login=11&pass=22"); 
?>

但是,由于标题,它仍然仅适用于图像...如果您发现任何适用于视频/视频流的内容,请告诉我!

【讨论】:

正如之前所说,看起来很有希望,但不适用于图像和/或视频。我仍然相信这是一个很好的起点,但我猜 passthru 函数的参数有错误。我必须了解更多我以前从未使用过的功能。 我也没用过...但是我在php.net上找到了一个关于这个函数的注释:“启用安全模式后,您只能执行safe_mode_exec_dir中的文件。为了实用原因,目前不允许在可执行文件的路径中包含 .. 组件。”或许问题出在这里…… 我在这里打开了另一个答案link 这次我已经包含了带有测试凭据的视频流的真实来源。希望对您有所帮助。【参考方案2】:

好吧,至少对于可以使用 curl 的图像... 正如我在 cmets 中所指出的,您可以创建一个包含以下内容的 php 文件(例如 my.php):

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://example.com/?password=4444&login=1111');
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_BINARYTRANSFER,1);
$picture = curl_exec($ch);
curl_close($ch);
//Display the image in the browser
header('Content-type: image/jpeg');
echo $picture;

而不仅仅是写:

 <img src='my.php'>

附:虽然我认为这不是最好的做事方式,但看起来它可以解决问题。 img src 中不再有私人数据。我从来没有像视频格式一样,但至于图像似乎很容易。 您可以在此处阅读有关 curl 的更多信息:http://php.net/manual/en/book.curl.php

【讨论】:

非常感谢您的及时反馈!使用 curl 是一个非常好的主意,实际上它适用于图像。您可以在此处查看我使用您的代码所做的测试:link 无法理解图片的原始来源。目前它适用于图片,但我相信在标题上工作也可以流式传输视频。我会及时通知你的!

以上是关于将图像/视频流嵌入网页的主要内容,如果未能解决你的问题,请参考以下文章

腾讯视频嵌入网页的方法 腾讯视频网页嵌入代码方法

如何从嵌入式视频中获取缩略图?

如何将视频从 Google 驱动器嵌入到网页?

如何在视频的第一帧之前放置静止图像?

如何将占位符图像添加到嵌入的 Vimeo 和 Youtube 视频中?

将每个视频嵌入到webhost上的目录中