2

mms:// ストリームが存在するかどうかをテストする php スクリプトを作成しようとしています。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 ストリームを検証するために私が書いた非常に OOOOOOOOLD なコードがあります。あなたはそれからいくらかの用途を引き出すかもしれません。

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 Media Server (MMS) プロトコルはあまり知られていないようです。唯一の推奨事項(そして私は暗闇の中でのショットだと思います)は、 fsockopen を使用して応答を確認し、それを実行することです。それ以外の場合、それは暗闇の中でのショットです。リンクされたウィキペディアのページが示唆するように、プロトコルのリバース エンジニアリングを試みた人もいます。

于 2011-01-24T03:09:38.217 に答える
0

のドキュメントを確認してくださいsocet_connect()。2 番目のパラメーター (アドレス) は、IPv4 または IPv6 アドレスでなければなりません。mms ストリームの経験はありませんが、サーバーに (その IP を使用して) 接続し、ソケットの名前 (mms:// の後のすべて) をサーバーに送信すると思います。さらにサポートするには、MMS ストリームの詳細が必要です。

于 2011-01-24T03:12:21.620 に答える
0

mms://URL を 2 番目のパラメーターとして使用することはできません。socket_connect()は、ネットワーク アドレスまたはサーバー名のみを受け取ります。その生のソケット機能を使用すると、せいぜいポートに接続できますが、MMS サーバーと対話することはできません。したがって、これを調べない限り、ファイル パスを確認することはできません: http://msdn.microsoft.com/en-us/library/cc234711(PROT.10).aspx固定幅および/または null で終了する文字列。)

于 2011-01-24T03:13:05.423 に答える