簡體   English   中英

使用PHP檢查mms流是否存在

[英]Check if mms stream exists or not using PHP

我正在嘗試編寫一個PHP腳本來測試是否存在mms://流。 我無法使用php函數(例如socket_connect / fopen / fsockopen / etc)來做到這一點。 我已經在網上搜索了幾個小時,在其他論壇上也發現了類似的問題,但是沒有人給出答案(甚至是不可能的答案)。

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

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';
}
?>

您可能需要考慮使用具有命令行功能的視頻播放器,例如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;
}

我建議您考慮在PHP實現MMS 這應該為您提供指導,以檢查文件的存在(使用cURL庫)。

編輯

另外,看來Microsoft Media Server (MMS)協議並不是很知名,人們在嘗試做自己的工作時遇到了問題 唯一的建議(我猜是在黑暗中拍攝)將使用fsockopen並檢查響應並接受,否則,它是在黑暗中拍攝。 正如鏈接的Wikipedia頁面所建議的那樣,有些人嘗試過對該協議進行逆向工程,這可能是您最好的選擇。

檢查socet_connect()文檔 第二個參數(地址)必須是IPv4或IPv6地址。 我對mms流沒有經驗,但是我的猜測是連接到服務器(及其IP),然后將套接字的名稱(mms://之后的所有內容)發送到服務器。 我需要有關MMS流的更多詳細信息,以進一步為您提供幫助。

您不能使用mms:// URL作為第二個參數。 socket_connect()僅在其中使用網絡地址或服務器名稱。 使用該原始套接字功能,您最多可以連接到端口,但不能與MMS服務器進行交互。 因此,除非您進行以下研究,否則無法檢查文件路徑: http : //msdn.microsoft.com/zh-cn/library/cc234711PROT.10).aspx (乍一看,典型的Microsoft二進制協議具有固定寬度和/或null終止的字符串。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM