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头解决跨域限制,禁用缓存确保每次请求都使用最新的有效令牌。
- 方案1通过
- 异常捕获:用try-catch包裹核心逻辑,统一处理所有意外错误,返回清晰的错误信息。
额外注意事项
- 令牌有效期:确认
video_token的过期时间,确保每次请求都能获取到有效令牌(你的代码已经实现了实时获取,这一点没问题)。 - 服务器配置:如果使用方案2,要确保PHP服务器的
allow_url_fopen配置项处于开启状态,否则无法获取外部流内容。 - 兼容性调整:部分IPTV播放器可能需要
application/x-mpegURL作为Content-Type,你可以根据实际测试情况替换。
内容的提问来源于stack exchange,提问作者baba
相关产品推荐
相关产品推荐

