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

PHP生成视频URL无法在IPTV播放器播放,求添加适配代码

解决PHP生成的IPTV流URL无法播放的问题

嘿,我看了你的代码,问题出在你只是输出了M3U8的URL字符串,但IPTV播放器需要的是符合HTTP标准的流响应,而不是纯文本的URL。咱们来修改代码,让它能被IPTV播放器正确识别:

修改后的完整代码

<?php
// 安全过滤输入的频道ID,防止恶意请求
$input = filter_input(INPUT_GET, 'c', FILTER_SANITIZE_STRING);
if (!$input) {
    http_response_code(400);
    exit("Channel ID not found");
}

// 封装JSON请求函数,增加错误处理
function JsonfromURI($url) {
    $context = stream_context_create([
        'http' => [
            'timeout' => 10 // 设置超时,避免服务器卡住
        ]
    ]);
    $resp = file_get_contents($url, false, $context);
    if ($resp === false) {
        http_response_code(500);
        exit("Failed to fetch data from API");
    }
    $data = json_decode($resp);
    if (json_last_error() !== JSON_ERROR_NONE) {
        http_response_code(500);
        exit("Invalid JSON response from API");
    }
    return $data;
}

try {
    // 获取频道元数据和播放令牌
    $channel_meta = JsonfromURI("https://catalogapi.com/v1/channel/${input}");
    $tok_json = JsonfromURI("https://useraction.com/token/live.php");
    
    // 拼接完整的M3U8流地址
    $m3u8_url = $channel_meta->stream_url_hls . $tok_json->video_token;

    // 方案1:直接重定向到M3U8地址(推荐,减少服务器负载)
    // 设置正确的HTTP头,让播放器识别为重定向
    header("Location: {$m3u8_url}");
    header("Content-Type: application/vnd.apple.mpegurl");
    exit;

    // 方案2:代理M3U8内容(适用于原地址有跨域限制的情况)
    /*
    $m3u8_content = file_get_contents($m3u8_url, false, $context);
    if ($m3u8_content === false) {
        http_response_code(500);
        exit("Failed to fetch stream content");
    }
    // 设置IPTV播放器需要的HTTP头
    header("Content-Type: application/vnd.apple.mpegurl");
    header("Access-Control-Allow-Origin: *"); // 允许跨域请求
    header("Cache-Control: no-cache, no-store, must-revalidate"); // 禁用缓存,避免旧令牌失效
    header("Pragma: no-cache");
    header("Expires: 0");
    echo $m3u8_content;
    */
} catch (Exception $e) {
    http_response_code(500);
    exit("Error: " . $e->getMessage());
}
?>

关键修改点说明

  • 输入安全过滤:用filter_input过滤频道ID,防止恶意输入导致的安全问题。
  • 错误处理增强:给JsonfromURI函数添加超时、请求失败和JSON解析错误的处理,避免出现无意义的空白页或错误。
  • 正确的HTTP头配置:
    • 方案1通过Location重定向到实际流地址,同时设置M3U8专属的Content-Type,让播放器直接识别并跳转播放。
    • 方案2代理流内容时,添加CORS头解决跨域限制,禁用缓存确保每次请求都使用最新的有效令牌。
  • 异常捕获:用try-catch包裹核心逻辑,统一处理所有意外错误,返回清晰的错误信息。

额外注意事项

  1. 令牌有效期:确认video_token的过期时间,确保每次请求都能获取到有效令牌(你的代码已经实现了实时获取,这一点没问题)。
  2. 服务器配置:如果使用方案2,要确保PHP服务器的allow_url_fopen配置项处于开启状态,否则无法获取外部流内容。
  3. 兼容性调整:部分IPTV播放器可能需要application/x-mpegURL作为Content-Type,你可以根据实际测试情况替换。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 07:34:14