ホームページ  >  に質問  >  本文

PHPプロキシを使用してhttps経由でhttp mjpgをストリーミングする方法

<p>この php スクリプトは、HTTP 経由で mjpg ストリームをロードし、HTTPS 経由で出力することになっています。ただし、生成されるのは壊れた画像だけです: </p> <pre class="brush:php;toolbar:false;"><?php 関数 proxyMjpegStream($url) { $ch =curl_init($url); curl_setopt($ch, CURLOPT_HEADER, false); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($ch, CURLOPT_TIMEOUT, 30); curl_setopt($ch, CURLOPT_BUFFERSIZE, 8192); header("Content-Type: multipart/x-mixed-replace;boundary=myboundary"); curl_exec($ch); カール_クローズ($ch); } // プロキシする MJPEG ストリームの URL を取得します if (isset($_GET['url'])) { $mjpegUrl = $_GET['url']; // URL が有効な HTTP ソースであることを検証します if (filter_var($mjpegUrl, FILTER_VALIDATE_URL) && strpos($mjpegUrl, 'http://') === 0) { proxyMjpegStream($mjpegUrl); 出口; } } // MJPEG URL パラメータが無効または欠落しています header("HTTP/1.0 400 Bad Request"); echo "無効な MJPEG URL"; ?>

P粉835428659P粉835428659384日前479

全員に返信(2)返信します

  • P粉588152636

    P粉5881526362023-09-04 15:45:35

    これは質問に対する実際の答えではありません。Anas がすでにこれについて説明していますが、とにかく言及する価値があり、コメントには当てはまりません。

    次のようなコード ブロックを記述するのは困難になります:

    リーリー

    エラー状態を最後まで延期し、エラー以外の状態を if(){} ブロックに含めると、2 つの問題が発生します。

    1. エラーを引き起こす条件は、エラー メッセージが生成される場所からますます切り離されていきます。
    2. 「幸福への道」コードは、arrow アンチパターン として知られる、ネストされた if(){} ブロックの奥深くに埋め込まれています。

    再フォーマットできます:

    リーリー ### に: ### リーリー

    これは厳密なルールではありませんが、心に留めておくと、ばらばらのコード ブロックや混乱を招くコード ブロック、またはページの右側にまで広がってしまうコード ブロックの作成を避けることができます。

    返事
    0
  • P粉523625080

    P粉5236250802023-09-04 09:43:59

    いくつかの調査の後、次の関数を使用して、curl でストリームを実行できます:

    リーリー

    そしてコールバック関数を作成します:

    リーリー

    コードは正常に動作しますが、curl_setopt($ch, CURLOPT_TIMEOUT, 30);

    を設定したため、30 秒後にストリームが終了します。

    cURL は主に静的コンテンツを取得する HTTP リクエストを行うように設計されているため、ストリーミング URL には fopen() を使用することをお勧めします。 MJPEG ストリームは動的であり、新しいフレームが継続的に送信されます。

    デフォルトでは、cURL はリクエストごとにタイムアウトを設定します。サーバーがフレームを送信するのに長い時間がかかる場合、リクエストがタイムアウトになり、ストリームが中断されたり、エラー メッセージが表示されたりする可能性があります。

    最良のエクスペリエンスを得るには、fopen() 関数を使用できます。 以下はストリームと fopen を使用した例です。

    リーリー

    返事
    0
  • キャンセル返事