如何通过 https 使用 php 代理传输 http mjpg
P粉835428659
P粉835428659 2023-09-03 20:54:13
0
2
453

我有这个 php 脚本,它应该通过 HTTP 加载 mjpg 流并通过 HTTPS 输出。然而,它产生的只是一个破碎的图像:

P粉835428659
P粉835428659

全部回复 (2)
P粉588152636

这并不是问题的真正答案,Anas 已经涵盖了这一点,但无论如何还是值得一提,并且不适合在评论中。

编写这样的代码块时会遇到麻烦:

// Get the URL of the MJPEG stream to proxy if (isset($_GET['url'])) { $mjpegUrl = $_GET['url']; // Validate that the URL is a valid HTTP source if (filter_var($mjpegUrl, FILTER_VALIDATE_URL) && strpos($mjpegUrl, 'http://') === 0) { proxyMjpegStream($mjpegUrl); exit; } } // Invalid or missing MJPEG URL parameter header("HTTP/1.0 400 Bad Request"); echo "Invalid MJPEG URL";

如果您继续将错误条件推迟到最后,并将非错误条件包含在if(){}块中,则会遇到两个问题。

  1. 触发错误的条件与生成错误消息的位置越来越脱节。
  2. 您的“幸福之路”代码越来越深地埋藏在嵌套if(){}块中,称为箭头反模式

您可以重新格式化:

if( good ) { if( also good ) { do_thing(); exit(); } else { raise_error('also bad'); } } raise_error('bad');

致:

if( ! good ) { raise_error('bad'); } if( ! also good ) { raise_error('also bad'); } do_thing();

这不是一个一成不变的规则,但牢记它可以帮助避免编写脱节或混乱的代码块,或最终延伸到页面右侧的代码块。

    P粉523625080

    经过一些研究后,您可以使用以下函数在curl中执行流:

    curl_setopt($ch, CURLOPT_WRITEFUNCTION, 'streamCallback');

    并创建回调函数:

    function streamCallback($curl, $data) { // Process the received data echo $data; // Return the length of the data processed return strlen($data); }

    您的代码可以正常工作,但 30 秒后您的流将结束,因为您设置了curl_setopt($ch, CURLOPT_TIMEOUT, 30);

    我对流 URL 的建议是使用fopen()因为 cURL 主要是为发出 HTTP 请求来获取静态内容而设计的。 MJPEG 流是动态的并且不断发送新帧。

    默认情况下,cURL 为每个请求设置了超时。如果服务器发送帧的时间较长,请求可能会超时,从而导致流中断或错误消息。

    您可以使用fopen()函数以获得最佳体验。 这是使用流和 fopen 的示例。

      最新下载
      更多>
      网站特效
      网站源码
      网站素材
      前端模板
      关于我们 免责声明 Sitemap
      PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!