4

我有一个来自 Tenvis IP 摄像机的实时流,通过 http 实时流和它的 mjpeg 压缩。

我正在尝试将其保存到文件中,并且我尝试使用 php 来执行此操作。我的代码如下所示:

<?php
$input = fopen("http://xxx.xxx.xxx.xxx:81/videostream.cgi?user=user&pwd=admin&resolution=8");
$output = fopen("video.mpg", "c+");
$end = time() + 60;
do {
    fwrite($output, (fread($input, 30000)), 30000);
} while (time() <= $end);
fclose($output);
fclose($input);
echo "<h1>Recording</h1>";
?>

我创建的代码创建了文件,但没有向其中写入任何内容。任何建议将不胜感激

4

2 回答 2

1

根据关于 MJPEG 的 Wikipedia 页面(http://en.wikipedia.org/wiki/Motion_JPEG#M-JPEG_over_HTTP),HTTP上的 MJPEG 流基本上是一个 JPEG 帧序列,伴随着一个特殊的 mime 类型。为了捕获这些并将它们保存到视频文件中,我不确定您是否可以简单地将传入数据写入 .mpg 文件并拥有工作视频。

老实说,我不太清楚为什么您的脚本根本没有写任何东西,但我遇到了以下页面,虽然它是为特定软件编写的,但提供了有关如何捕获 MJPEG 流并将其传递的示例到浏览器: http ://www.lavrsen.dk/foswiki/bin/view/Motion/MjpegFrameGrabPHP

您可以尝试其中一个示例,而不是将其传递给浏览器,而是将其保存到文件中。您可以看到他们一次读取一张图像:

while (substr_count($r,"Content-Length") != 2) $r.=fread($input,512);
$start = strpos($r,'ÿ');
$end   = strpos($r,$boundary,$start)-1;
$frame = substr("$r",$start,$end - $start);

如果这确实修复了流捕获部分但没有将其保存为视频,另一种选择是将所有帧单独保存为 JPEG 文件,然后使用 ffmpeg 等工具将它们拼接在一起以创建视频:图像序列到视频质量

更新 如果你决定走 ffmpeg 路,也可以只使用 ffmpeg 来抓流。有关示例,请参见此问题。

希望这可以帮助。

于 2013-10-04T15:29:15.243 回答
0

大多数时候,当相机支持 mjpeg 时,它也支持 rtsp,因此您可能希望将其作为您想要完成的解决方案。这样,使用 VLC 之类的应用程序进行录制就相当简单了。

于 2017-11-30T17:52:27.420 回答