2017-05-08 42 views
2

我在這裏有一個稍微不尋常的問題。我有一個從互聯網上可以訪問的PHP服務器。該服務器託管一個小型控制面板,允許我做一些事情,但我主要用它來遠程打開我的電腦。這個系統是受密碼保護的,我這樣做是因爲wake-on-lan命令沒有任何形式的認證。嵌入遠程媒體文件

我有一臺不能從互聯網訪問的IP攝像機,但它可以通過HTTP從本地網絡訪問。它提供了一個網頁,以及幾種查看相機流的方法。其中之一是顯示相機流的「video.mp4」文件。我想通過在php頁面中嵌入video.mp4文件,使其可以從我的服務器訪問。然而,這有兩個問題:

  • 首先,攝像頭視圖不能從網絡外部訪問,所以瀏覽器無法訪問該文件(意味着沒有視頻標籤) - 我需要一些閱讀方式文件服務器端,然後將其提供給客戶端。
  • 其次,相機也有密碼保護。幸運的是,它被配置爲通過在URL中輸入密碼讓我進入,如「http://username:[email protected]/video.mp4」。

我試過包括() - 荷蘭國際集團的遠程文件,但是這給了一個錯誤信息:

PHP Warning: include(http://[email protected]/video.mp4): failed to open stream: no suitable wrapper could be found in /var/www/html/camera.php 
PHP Warning: include(): Failed opening 'http://[email protected]/video.mp4' for inclusion (include_path='.:/usr/share/php:/usr/share/pear') in /var/www/html/camera.php 

這可能意味着我不能只是一個MP4流複製到PHP文件。我並沒有真正期望它的工作是誠實的,更多的是看看錯誤信息是否會給我提示如何正確執行此操作。

我曾考慮過打開相機的端口,但由於其網絡界面不支持SSL,我認爲這太不安全了。

回答

0

要允許包含的遠程文件,該指令allow_url_include必須設定爲開php.ini中

但它是壞的,在視安全爲導向的點;因此,它通常是禁用的(我從來沒有見過它啓用,實際上)

這是不相同的allow_url_fopen,其中處理打開(而不包括)遠程文件 - 這一個是通常啓用,因爲它使數據的抓取通過HTTP更容易(更容易比使用curl)

的讀取MP4文件

<?php 
// replace 'file.mp4' to your file in the line bellow 
$path = 'file.mp4'; 

$size=filesize($path); 

[email protected]($path,'rb'); 
if(!$fm) { 
    // You can also redirect here 
    header ("HTTP/1.0 404 Not Found"); 
    die(); 
} 

$begin=0; 
$end=$size; 

if(isset($_SERVER['HTTP_RANGE'])) { 
    if(preg_match('/bytes=\h*(\d+)-(\d*)[\D.*]?/i', $_SERVER['HTTP_RANGE'], $matches)) { 
    $begin=intval($matches[0]); 
    if(!empty($matches[1])) { 
     $end=intval($matches[1]); 
    } 
    } 
} 

if($begin>0||$end<$size) 
    header('HTTP/1.0 206 Partial Content'); 
else 
    header('HTTP/1.0 200 OK'); 

header("Content-Type: video/mp4"); 
header('Accept-Ranges: bytes'); 
header('Content-Length:'.($end-$begin)); 
header("Content-Disposition: inline;"); 
header("Content-Range: bytes $begin-$end/$size"); 
header("Content-Transfer-Encoding: binary\n"); 
header('Connection: close'); 

$cur=$begin; 
fseek($fm,$begin,0); 

while(!feof($fm)&&$cur<$end&&(connection_status()==0)) 
{ print fread($fm,min(1024*16,$end-$cur)); 
    $cur+=1024*16; 
    usleep(1000); 
} 
die(); 

基本例如您還可以使用

readfile('http://example.com/file.mp4'); 

readfile()讀取文件(甚至通過http遠程)並立即輸出它的內容。

+1

我在這個測試中啓用了php.ini中的allow_url_include,考慮到它在默認情況下沒有啓用,我在完成測試後將其禁用。我會用fopen嘗試一些東西,如果我找到任何東西,我會在這裏報告。 – latias1290

+0

我用一個如何使用fopen讀取mp4文件的示例更新了我的答案 –

+0

請注意,相機流是一個沒有特定文件大小的流。我假設文件大小()在這樣的文件將無法正常工作? – latias1290