2013-08-25 52 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等應用程序進行記錄相當簡單。