So streamen Sie http mjpg über https mithilfe eines PHP-Proxys
P粉835428659
2023-09-03 20:54:13
<p>Ich habe dieses PHP-Skript, das einen MJPG-Stream über HTTP laden und über HTTPS ausgeben soll. Es entsteht jedoch lediglich ein kaputtes Bild: </p>
<pre class="brush:php;toolbar:false;"><?php
Funktion 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);
curl_close($ch);
}
// Holen Sie sich die URL des MJPEG-Streams zum Proxy
if (isset($_GET['url'])) {
$mjpegUrl = $_GET['url'];
// Überprüfen Sie, ob die URL eine gültige HTTP-Quelle ist
if (filter_var($mjpegUrl, FILTER_VALIDATE_URL) && strpos($mjpegUrl, 'http://') === 0) {
ProxyMjpegStream($mjpegUrl);
Ausfahrt;
}
}
// Ungültiger oder fehlender MJPEG-URL-Parameter
header("HTTP/1.0 400 Bad Request");
echo „Ungültige MJPEG-URL“;
?></pre></p>
这并不是问题的真正答案,Anas 已经涵盖了这一点,但无论如何还是值得一提,并且不适合在评论中。
编写这样的代码块时会遇到麻烦:
如果您继续将错误条件推迟到最后,并将非错误条件包含在
if(){}
块中,则会遇到两个问题。if(){}
块中,称为 箭头反模式。您可以重新格式化:
致:
这不是一个一成不变的规则,但牢记它可以帮助避免编写脱节或混乱的代码块,或最终延伸到页面右侧的代码块。
经过一些研究后,您可以使用以下函数在curl中执行流:
并创建回调函数:
您的代码可以正常工作,但 30 秒后您的流将结束,因为您设置了
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
我对流 URL 的建议是使用
fopen()
因为 cURL 主要是为发出 HTTP 请求来获取静态内容而设计的。 MJPEG 流是动态的并且不断发送新帧。默认情况下,cURL 为每个请求设置了超时。如果服务器发送帧的时间较长,请求可能会超时,从而导致流中断或错误消息。
您可以使用
fopen()
函数以获得最佳体验。 这是使用流和 fopen 的示例。