在html5中渲染MJpeg流

Lio*_*ana 7 javascript html5 mjpeg

我正在尝试使用img标记在HTML5中呈现MJpeg流.当我运行以下内容时,一切都运行良好,意味着视频开始播放,直到视频结束:

<img src="http://[some ip]:[port]/mjpg">
Run Code Online (Sandbox Code Playgroud)

我的问题是如何逐帧获取流.对于每一帧,我想得到它,做一些事情(ajax调用服务器),然后将帧显示为图像.

谢谢.

小智 7

您无需重复发出 Http 请求即可执行此操作。只有一个就足够了。您可以使用fetch api创建一个ReadableStream,访问它的Reader并继续从流中读取。

一旦你让读者继续从流中递归读取块。在字节流中查找 SOI ( 0xFF 0xD8 ),它表示标头的结束和 JPEG 帧的开始。标头将包含要读取的 JPEG 的长度(以字节为单位)。从块和任何连续的块中读取那么多字节并将其存储到Uint8Array 中。成功读取帧并将其转换为 blob 后,从中创建一个 UrlObject 并将其分配给 img 对象的 src 属性。

继续这样做,直到连接关闭。

无耻的插头。这是github上工作示例的链接。


Zor*_*one 6

如果相机暴露原始 JPEG 图像(不是 .MJPEG 扩展名),您必须手动重新加载它(如果扩展名是 .MJPEG,浏览器将执行所有操作,只需输入正确的 src)。如果您有 .MJPEG 并且想要使用原始 .JPEG,请检查您的相机文档。大多数相机都会公开 .MJPEG 和原始 .JPEG 流(只是在不同的 URL 上)。

不幸的是,您无法通过ajax轻松获取图像,但您可以定期更改图像的src。

您可以使用Date.getTime()它并将其添加到查询字符串中以强制浏览器重新加载图像,并在每次加载图像时重复。

如果您使用 jQuery,代码将如下所示:

相机.html

<!DOCTYPE html>
<html>

<head>
    <title>ipCam</title>
</head>

<body>
    <h1>ipCam</h1>
    <img id="motionjpeg" src="http://user:pass@127.0.0.1:8080/" />
    <script src="motionjpeg.js"></script>
    <script>
        //Using jQuery for simplicity

        $(document).ready(function() {
            motionjpeg("#motionjpeg"); // Use the function on the image
        });
    </script>
</body>

</html>
Run Code Online (Sandbox Code Playgroud)

运动jpeg.js

function motionjpeg(id) {
    var image = $(id), src;

    if (!image.length) return;

    src = image.attr("src");
    if (src.indexOf("?") < 0) {
        image.attr("src", src + "?"); // must have querystring
    }

    image.on("load", function() {
        // this cause the load event to be called "recursively"
        this.src = this.src.replace(/\?[^\n]*$/, "?") +
            (new Date()).getTime(); // 'this' refers to the image
    });
}
Run Code Online (Sandbox Code Playgroud)

请注意,我的示例将在页面加载时播放 MotionJPEG,但不允许播放/暂停/停止功能


小智 2

如果您的流源无法返回另一个地址(http://[some ip]:[port]/frame/XXX)上的帧,那么您可以在服务器上使用 MJPEG 流解析器。例如,Paparazzo.js解析流并返回单个 jpeg。实际上它只返回最后一帧而不保存前一帧,但它可以更改。

仅在带有js的浏览器中无法解决问题,而无需一些插件和服务器。