2011-01-24 37 views
2

我想寫一個php腳本來測試一個mms://流是否存在。我一直無法使用諸如socket_connect/fopen/fsockopen /等php函數來完成它。我一直在網上搜索幾個小時,並在其他論壇發現了類似的問題,但沒有人真正給出答案(或者甚至是否可能)。檢查流媒體是否存在或不使用PHP

這是我沒有運氣使用的可能的代碼:

PHP代碼:

<?php 
$socket = socket_create(AF_INET, SOCK_RAW, 1); 
if(!$connect = socket_connect($socket, "mms://some.mms/stream", 1755)) 
{ 
    echo 'Offline'; 
} 
else 
{ 
    echo 'Online'; 
} 
?> 

回答

0

我會建議看implementing MMS in PHP。這應該爲您提供指導來檢查文件的存在(使用cURL庫)。

編輯

而且,它出現在Microsoft Media Server(MMS)協議是不是很知名的,和人有過problems trying to do what you are。只有建議(和我猜在黑暗中拍攝)將使用fsockopen並檢查一個響應,並通過它,否則這是在黑暗中拍攝。正如鏈接的維基百科頁面所示,有些人曾嘗試對協議進行逆向工程,這可能是您最好的選擇。

0

檢查socet_connect()documentation。第二個參數(地址)必須是IPv4或IPv6地址。我沒有mms流的經驗,但我的猜測是連接到服務器(使用它的IP),然後將套接字的名稱(在mms://之後的所有內容)發送到服務器。 我需要更多有關MMS流的細節來進一步幫助您。

0

您不能使用mms:// URL作爲第二個參數。 socket_connect()只需要一個網絡地址或服務器名稱。使用該原始套接字功能,您最多可以連接到端口,但不能與MMS服務器交互。因此,檢查文件路徑是不可能的,除非你研究這個:http://msdn.microsoft.com/en-us/library/cc234711(PROT.10).aspx(乍一看,一個典型的微軟二進制協議,帶有固定寬度和/或以空字符結束的字符串。)

1

你可能想使用視頻具有命令行功能的播放器,例如VLC。你可以通過PHP的內部'exec'函數訪問它並解析結果。或者,您也可以使用FFMPEG庫打開流並確定它是否存在/可以播放。

FFMPEG:http://ffmpeg-php.sourceforge.net/
VLC:http://www.videolan.org/vlc/

我公司專業從事在線流媒體視頻和這些我們遇到了一些相同的問題;應該給你一個很好的起點。

此外,我寫了一段代碼,用於幫助我們使用PHP的socket_connect驗證RTSP流。你可能會從中得到一些用處。

final static public function validateRTSP($url) 
{ 
$url_bits = parse_url($url); 

$port = isset($url_bits['port']) ? $url_bits['port'] : 554; 

if(false == isset($url_bits['host'])) 
{ 
    throw new Exception("The URL `{$url}` does not have a valid host assignment."); 
} 

if(isset($url_bits['host'])) 
{ 
    if(false === $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) 
    { 
     socket_close($socket); 

     throw new Exception('A socket could not be opened: ' . socket_strerror(socket_last_error($socket))); 
    } 

    if(false === socket_connect($socket, $url_bits['host'], $port)) 
    { 
     socket_close($socket); 

     throw new Exception("A connection could not be established to {$url_bits['host']}: " . socket_strerror(socket_last_error($socket))); 
    } 

    $headers = array(); 

    $headers[] = "DESCRIBE {$url} RTSP/1.0"; 
    $headers[] = "User-Agent: WMPlayer/12.00.7600.16385 guid/3300AD50-2C39-46C0-AE0A-39E48EB3C868"; 
    $headers[] = "Accept: application/sdp"; 
    $headers[] = "Accept-Charset: UTF-8, *;q=0.1"; 
    $headers[] = "X-Accept-Authentication: Negotiate, NTLM, Digest"; 
    $headers[] = "Accept-Language: en-US, *;q=0.1"; 
    $headers[] = "CSeq: 1"; 
    $headers[] = "Supported: com.microsoft.wm.srvppair, com.microsoft.wm.sswitch, com.microsoft.wm.eosmsg, com.microsoft.wm.predstrm, com.microsoft.wm.fastcache, com.microsoft.wm.locid, com.microsoft.wm.rtp.asf, dlna.announce, dlna.rtx, dlna.rtx-dup, com.microsoft.wm.startupprofile"; 

    $headerString = implode("\r\n", $headers) . "\r\n\r\n"; 

    if(false === socket_write($socket, $headerString, strlen($headerString))) 
    { 
     socket_close($socket); 

     throw new Exception("Could not send headers to {$url_bits['host']}: " . socket_strerror(socket_last_error($socket))); 
    } 


    $response = ''; 

    if(false === socket_recv($socket, $response, 2048, MSG_WAITALL)) 
    { 
     socket_close($socket); 

     throw new Exception("Could not read response from {$url_bits['host']}: " . socket_strerror(socket_last_error($socket))); 
    } 

    socket_close($socket); 


    self::$passes[] = array 
    (
     'request' => $headerString, 
     'response' => $response 
    ); 


    if(preg_match_all('#^RTSP/.*\s+302+\s#i', $response, $match)) 
    { 
     preg_match_all('#(Location:\s(.*))\r\n#i', $response, $redirect_match); 

     return self::url($redirect_match[2][0]); 
    } 

    if(false == preg_match('#^RTSP/.*\s+[200]+\s#i', $response)) 
    { 
     throw new Exception("URL `{$url}` is invalid."); 
    } 

    if($attributes = array_pop(explode("\r\n\r\n", $response))) 
    { 
     preg_match_all("#([a-z]{1})={1}(.+)#i", $attributes, $all); 

     self::$attributes = $all[0]; 
    } 

    return true; 
}