2

我正在尝试编写一个 php 脚本来测试 mms:// 流是否存在。我无法使用诸如 socket_connect/fopen/fsockopen/etc 之类的 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';
}
?>
4

4 回答 4

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;
}
于 2011-01-24T04:13:25.027 回答
0

我建议看看在 PHP 中实现 MMS。这应该为您提供检查文件是否存在的指导(使用 cURL 库)。

编辑

此外,似乎Microsoft 媒体服务器(MMS) 协议并不是很有名,人们在尝试做你的事情时遇到了问题。唯一的建议(我猜是在黑暗中拍摄)是使用 fsockopen 并检查响应并通过它,否则它是在黑暗中拍摄的。正如链接的 Wikipedia 页面所暗示的那样,有些人尝试过对协议进行逆向工程,这些可能是您最好的选择。

于 2011-01-24T03:09:38.217 回答
0

检查. _ _ socet_connect()第二个参数(地址)必须是 IPv4 或 IPv6 地址。我没有使用 mms 流的经验,但我的猜测是连接到服务器(使用其 IP),然后将套接字的名称(mms:// 之后的所有内容)发送到服务器。我需要有关 MMS 流的更多详细信息,以进一步为您提供帮助。

于 2011-01-24T03:12:21.620 回答
0

您不能使用mms://URL 作为第二个参数。socket_connect()只需要一个网络地址或服务器名称。使用该原始套接字功能,您最多可以连接到端口,但不能与 MMS 服务器交互。因此检查文件路径是不可能的,除非你研究这个: http: //msdn.microsoft.com/en-us/library/cc234711 (PROT.10).aspx(乍一看典型的微软二进制协议,固定宽度和/或以 null 结尾的字符串。)

于 2011-01-24T03:13:05.423 回答