PHPプロキシを使用してhttps経由でhttp mjpgをストリーミングする方法
P粉835428659
2023-09-03 20:54:13
<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";
?>
これは質問に対する実際の答えではありません。Anas がすでにこれについて説明していますが、とにかく言及する価値があり、コメントには当てはまりません。
次のようなコード ブロックを記述するのは困難になります:
リーリーエラー状態を最後まで延期し、エラー以外の状態を
if(){}
ブロックに含めると、2 つの問題が発生します。arrow アンチパターン
として知られる、ネストされた if(){} ブロックの奥深くに埋め込まれています。再フォーマットできます:
リーリー ### に: ### リーリーこれは厳密なルールではありませんが、心に留めておくと、ばらばらのコード ブロックや混乱を招くコード ブロック、またはページの右側にまで広がってしまうコード ブロックの作成を避けることができます。
いくつかの調査の後、次の関数を使用して、curl でストリームを実行できます:
リーリーそしてコールバック関数を作成します:
リーリーコードは正常に動作しますが、
を設定したため、30 秒後にストリームが終了します。curl_setopt($ch, CURLOPT_TIMEOUT, 30);
cURL は主に静的コンテンツを取得する HTTP リクエストを行うように設計されているため、ストリーミング URL には
fopen()
を使用することをお勧めします。 MJPEG ストリームは動的であり、新しいフレームが継続的に送信されます。デフォルトでは、cURL はリクエストごとにタイムアウトを設定します。サーバーがフレームを送信するのに長い時間がかかる場合、リクエストがタイムアウトになり、ストリームが中断されたり、エラー メッセージが表示されたりする可能性があります。
最良のエクスペリエンスを得るには、
リーリーfopen()
関数を使用できます。 以下はストリームと fopen を使用した例です。