php - 从 IP 摄像机录制实时流(MJPEG 压缩)

标签 php video-streaming video-capture ip-camera

我通过 http 直播和 mjpeg 压缩从 Tenvis IP 摄像头获得直播。

我正在尝试将它保存到一个文件中,并且我已经尝试使用 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>";
?>

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

最佳答案

根据有关 MJPEG ( 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 等工具将它们拼接在一起以创建视频:Image sequence to video quality

更新 如果您决定走 ffmpeg 之路,也可以仅使用 ffmpeg 捕获流。有关示例,请参见 this 问题。

希望这对您有所帮助。

关于php - 从 IP 摄像机录制实时流(MJPEG 压缩),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18432478/

相关文章:

c# - 将两个网络摄像头流合并为一个实时流 - 以编程方式

php - Gmail PHP API 发送电子邮件

php - 在 Ubuntu 上安装 Joomla

javascript - Google Analytics 电子商务跟踪数据问题

Android:从url播放flv视频流

android - 是否可以使用 OpenGL ES 2.0 扭曲底层图像?

PHP POS(销售点)在 GoDaddy 共享主机下不工作

node.js - 是否可以从单个流字节范围 block 创建新的 mp4 文件?

c# - 视频播放器如何将帧数据写入屏幕?

c++ - 使用 `libopencv_ffmpeg.so` 在 Linux 上构建 OpenCV 2.4.11