2013-08-25 51 views
4

我有一个来自Tenvis IP摄像机的直播流,通过HTTP直播流和它的mjpeg压缩。从IP摄像机(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>"; 
?> 

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

回答

1

根据关于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问题。

希望这会有所帮助。

0

大多数情况下,当一台摄像机支持mjpeg时,它也支持rtsp,因此您可能希望将其作为您尝试完成的解决方案。因此,使用VLC等应用程序进行记录相当简单。