You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过PHP代理将HTTP MJPG流转为HTTPS输出?(脚本故障)

PHP MJPEG流代理显示损坏图片的修复方案

原代码存在几个核心问题导致MJPEG流显示损坏,逐一修正如下:

问题原因

  • CURLOPT_RETURNTRANSFER配置错误:该选项设为true时,curl会将整个流缓存到内存后再输出,但MJPEG是分块实时传输的流,缓存会打乱帧的顺序和结构。
  • 自定义Boundary不匹配:手动指定的boundary=myboundary和原MJPEG流的实际boundary不一致,客户端无法正确解析分块内容。
  • 未启用流式输出:没有配置curl实时输出获取到的流数据,一次性返回会破坏MJPEG的分块传输机制。
  • 未禁用PHP输出缓冲:PHP默认的输出缓冲会延迟内容发送,导致流的时序错误,客户端无法正常渲染。

修复后的代码

<?php
// 禁用PHP输出缓冲,确保内容实时发送
ob_end_flush();
ini_set('output_buffering', 'off');
ini_set('zlib.output_compression', false);

function proxyMjpegStream($url) {
    $ch = curl_init($url);
    
    // 关键:关闭返回转移,让curl直接输出内容到客户端
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, false);
    // 保留原响应头,直接转发包含正确boundary的Content-Type
    curl_setopt($ch, CURLOPT_HEADER, 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);
    // 禁用连接复用,确保实时传输
    curl_setopt($ch, CURLOPT_FORBID_REUSE, true);
    curl_setopt($ch, CURLOPT_FRESH_CONNECT, true);

    // 执行请求,直接输出流数据
    curl_exec($ch);
    
    // 捕获curl错误
    if(curl_errno($ch)){
        header("HTTP/1.0 500 Internal Server Error");
        echo "Curl Error: " . curl_error($ch);
    }
    
    curl_close($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);
        exit;
    }
}

// 无效或缺失URL参数的处理
header("HTTP/1.0 400 Bad Request");
echo "Invalid MJPEG URL";
?>

关键修改说明

  1. 禁用输出缓冲:通过ob_end_flush()和修改ini配置,消除PHP层面的内容延迟发送问题。
  2. 调整curl输出模式:关闭CURLOPT_RETURNTRANSFER,让curl直接将流数据实时输出到浏览器,而非缓存。
  3. 转发原响应头:不再手动设置Content-Type,直接复用原流的头信息,保证boundary与原流一致。
  4. 优化流式传输配置:添加CURLOPT_FORBID_REUSE等参数,确保连接始终处于实时传输状态,避免缓存干扰。

内容的提问来源于stack exchange,提问作者Simon Ferndriger

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 22:25:34