PHP输出MP4必须设置Content-Type: video/mp4、Accept-Ranges: bytes并正确处理Range请求,否则播放器因MIME不匹配或无分段支持而拒播;需用Nginx重写伪装路径,禁用超时与中断,并避免内存溢出。
直接把 .php 文件重命名为 .mp4,播放器依然会失败——因为 HTTP 响应头里的 Content-Type 是 text/html 或 application/x-httpd-php,不是 video/mp4。播放器根本不看文件名,只信响应头和实际字节流结构。
常见错误是只用 readfile() 输出文件,却漏掉关键响应头。MP4 播放(尤其带拖拽、快进)依赖 Accept-Ranges: bytes 和正确 Content-Type,否则 iOS Safari、VLC、部分 H5 播放器直接拒播或卡死。
header('Content-Type: video/mp4');
header('Accept-Ranges: bytes');
Range 请求头(用 $_SERVER['HTTP_RANGE'] 解析并输出分段)header('Cache-Control: public, max-age=31536000');
header('Content-Type: video/mp4');
header('Accept-Ranges: bytes');
header('Cache-Control: public, max-age=31536000');
$filepath = '/path/to/video.mp4';
if (isset($_SERVER['HTTP_RANGE'])) {
$range = $_SERVER['HTTP_RANGE'];
// 简化 Ran
ge 解析逻辑(生产环境需完整校验)
if (preg_match('/bytes=(\d+)-(\d+)?/', $range, $matches)) {
$start = (int)$matches[1];
$end = isset($matches[2]) ? (int)$matches[2] : filesize($filepath) - 1;
$length = $end - $start + 1;
header("HTTP/1.1 206 Partial Content");
header("Content-Range: bytes $start-$end/" . filesize($filepath));
header("Content-Length: $length");
$fp = fopen($filepath, 'rb');
fseek($fp, $start);
fpassthru($fp);
fclose($fp);
exit;
}}
// 全量输出
header('Content-Length: ' . filesize($filepath));
readfile($filepath);
不要用 URL 伪装(如 video.php?id=123),而要用真实路径映射
很多播放器(尤其是移动端)会预检 URL 后缀或拒绝非静态路径。即使 PHP 输出了正确 Header,https://site.com/play.php?v=abc 在某些 H5 播放器里仍被拦截或静音。
/videos/xxx.mp4 映射到 PHP 处理脚本,但对外保持 .mp4 路径location ~ ^/videos/.+\.mp4$ { rewrite ^/videos/(.+\.mp4)$ /video_proxy.php?file=$1 last; }
就能正常加载,且支持拖拽、HLS 兼容、CDN 缓存直接 readfile() 大文件易触发内存溢出或超时;不设 set_time_limit(0) 和 ignore_user_abort(true) 可能中途断连导致视频残缺。
set_time_limit(0);(禁用超时)ignore_user_abort(true);(用户关页面也不中断输出)fopen + fpassthru 替代 file_get_contents,避免内存吃满/var/www/private/videos/),确保 PHP 进程有读权限,且路径不被 Web 服务器直接暴露实际最难的不是改后缀,而是让 PHP 输出行为完全模拟静态 MP4 服务——Header 对、Range 支持稳、路径看起来像真文件、服务器不截断连接。少一个环节,iOS 或 Chrome 就可能静音、卡住、报 ERR_CONTENT_LENGTH_MISMATCH。
# php
# html
# 前端
# apache
# nginx
# 浏览器
# app
# 字节
# safari
# proxy
# ios
# cdn
# chrome
# fopen
# public
# private
# Length
# var
# location
# http
# https
# 播放器
# 拖拽
# 重写
# 大文件
# 也不
# 尤其是
# 就能
# 要用
# 不看
# 不被
相关文章:
微信h5制作网站有哪些,免费微信H5页面制作工具?
如何在服务器上三步完成建站并提升流量?
如何在Ubuntu系统下快速搭建WordPress个人网站?
制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?
php能控制zigbee模块吗_php通过串口与cc2530 zigbee通信【介绍】
桂林网站制作公司有哪些,桂林马拉松怎么报名?
公司网站的制作公司,企业网站制作基本流程有哪些?
如何通过FTP服务器快速搭建网站?
如何零基础在云服务器搭建WordPress站点?
用v-html解决Vue.js渲染中html标签不被解析的问题
建站中国必看指南:CMS建站系统+手机网站搭建核心技巧解析
矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?
如何通过万网虚拟主机快速搭建网站?
如何在IIS中配置站点IP、端口及主机头?
深圳 网站制作,深圳招聘网站哪个比较好一点啊?
如何访问已购建站主机并解决登录问题?
表情包在线制作网站免费,表情包怎么弄?
盘锦网站制作公司,盘锦大洼有多少5G网站?
零基础网站服务器架设实战:轻量应用与域名解析配置指南
如何获取免费开源的自助建站系统源码?
重庆市网站制作公司,重庆招聘网站哪个好?
如何获取PHP WAP自助建站系统源码?
如何在万网主机上快速搭建网站?
创业网站制作流程,创业网站可靠吗?
如何在建站宝盒中设置产品搜索功能?
手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?
建站主机空间推荐 高性价比配置与快速部署方案解析
C++中的Pimpl idiom是什么,有什么好处?(隐藏实现)
建站org新手必看:2024最新搭建流程与模板选择技巧
专业制作网站的公司哪家好,建立一个公司网站的费用.有哪些部分,分别要多少钱?
建站之星图片链接生成指南:自助建站与智能设计教程
html制作网站的步骤有哪些,iapp如何添加网页?
教育培训网站制作流程,请问edu教育网站的域名怎么申请?
高防服务器租用指南:配置选择与快速部署攻略
建站之星下载版如何获取与安装?
如何在IIS7上新建站点并设置安全权限?
教学论文网站制作软件有哪些,写论文用什么软件
?
小程序网站制作需要准备什么资料,如何制作小程序?
制作网站的软件免费下载,免费制作app哪个平台好?
如何彻底删除建站之星生成的Banner?
网站制作壁纸教程视频,电脑壁纸网站?
打鱼网站制作软件,波克捕鱼官方号怎么注册?
建站10G流量真的够用吗?如何应对访问高峰?
已有域名如何免费搭建网站?
如何用好域名打造高点击率的自主建站?
建站之星导航配置指南:自助建站与SEO优化全解析
免费公司网站制作软件,如何申请免费主页空间做自己的网站?
如何快速辨别茅台真假?关键步骤解析
如何选择服务器才能高效搭建专属网站?
网站专业制作公司有哪些,做一个公司网站要多少钱?
*请认真填写需求信息,我们会在24小时内与您取得联系。