Проверьте, существует ли поток mms или не использует PHP - PullRequest
2 голосов
/ 24 января 2011

Я пытаюсь написать скрипт 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';
}
?>

Ответы [ 4 ]

1 голос
/ 24 января 2011

Возможно, вы захотите использовать видеоплеер с функцией командной строки, например, VLC. Вы можете получить к нему доступ через встроенную функцию PHP 'exec' и проанализировать результат. Кроме того, вы также можете использовать библиотеку FFMPEG, чтобы открыть поток и определить, существует ли он или может быть воспроизведен.

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

Наша компания специализируется на потоковом онлайн-видео, и мы столкнулись с некоторыми из тех же проблем; должен дать вам хорошую отправную точку.

Кроме того, вот ОЧЕНЬ бит кода, который я написал, чтобы помочь нам проверить потоки RTSP с помощью PHP socket_connect. Вы можете извлечь из этого пользу.

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;
}
0 голосов
/ 24 января 2011

Проверьте документацию из socet_connect().Второй параметр (адрес) должен быть адресом IPv4 или IPv6.У меня нет опыта работы с потоком mms, но я предпочитаю подключиться к серверу (с его IP-адресом), а затем отправить имя сокета (все после mms: //) на сервер.Мне нужно больше информации о потоке MMS, чтобы помочь вам в дальнейшем.

0 голосов
/ 24 января 2011

Нельзя использовать URL mms:// в качестве второго параметра. socket_connect () принимает только сетевой адрес или имя сервера. С этой функцией необработанного сокета вы можете в лучшем случае подключиться к порту, но не взаимодействовать с сервером MMS. Таким образом, проверка пути к файлу невозможна, если вы не изучите это: http://msdn.microsoft.com/en-us/library/cc234711(PROT.10).aspx (На первый взгляд типичный двоичный протокол Microsoft с фиксированной шириной и / или строкой с нулевым символом в конце).

0 голосов
/ 24 января 2011

Я бы порекомендовал посмотреть на реализацию MMS в PHP . Это должно помочь вам проверить наличие файла (с помощью библиотеки cURL).

EDIT

Кроме того, похоже, что протокол Microsoft Media Server (MMS) не очень хорошо известен, и у людей были проблемы с попытками сделать то, что вы . Единственная рекомендация (и я думаю, что выстрел в темноте) будет использовать fsockopen, проверить ответ и пойти по этому, в противном случае это выстрел в темноте. Как показывает ссылка на странице Википедии, есть некоторые, кто пытался реверс-инжиниринг протокола, это может быть вашим лучшим выбором.

...