PHP无法将文件“变成MP4”或直接加密MP4,只能通过代理输出实现访问控制;MP4加密需用FFmpeg等工具实现CENC标准,配合DRM系统,PHP仅负责鉴权与流式输出。PHP 文件本身不能“变成 MP4”,它只是服务器端脚本,执行后可能生成、读取或输出 MP4 文件,但不会“转换为”视频格式。真正需要的,是**对 PHP 输出的 MP4 文件做访问控制或内容加密**——而这两者完全不同:一个是 HTTP 层权限管控,一个是媒体文件级 AES 加密。 下面分清楚场景,直接说怎么做:
多数人所谓“加密码”,其实是防止别人直接通过 URL 下载视频(比如 https://example.com/videos/123.mp4)。PHP 无法给 MP4 文件本身加密码,但可以拦截请求、校验身份后再输出文件流。
/var/www/private/videos/),避免被直接访问/play.php?id=abc,PHP 检查 session 或 token 合法后,再用 readfile() 输出二进制流header('Content-Type: video/mp4');
header('Content-Length: ' . filesize($mp4_path));
header('Accept-Ranges: bytes');echo file_get_contents() 输出大视频,容易内存溢出;改用 readfile() 或分块 fread()
可以,但浏览器无法直接播放加密后的 MP4。标准 MP4 容器不支持内置密码,所谓“加密 MP4”实际是:用 AES-128 加密 H.264/AAC 的 NALU 或 sample 数据,再配合 .m3u8 + .key 实现 HLS 加密播放——这是流媒体方案,不是单个 MP4 加密码。
ffmpeg 命令行配合 key 文件:ffmpeg -i input.mp4 -c copy -f mp4 -encryption_scheme cenc -encryption_key 0123456789abcdef0123456789abcdef -encryption_kid 0123456789abcdef0123456789abcdef output_encrypted.mp4
tion)格式,需搭配 DRM 系统(如 Widevine、FairPlay)解密,普通 HTML5 标签打不开PHP 标准库没有 password_protect_mp4()、encrypt_video() 这类函数——它们不存在。网上搜到的“PHP 加密 MP4”教程,90% 是误导:要么是伪造下载链接(带一次性 token),要么是把 MP4 base64 后塞进 HTML 再 JS 解码(毫无安全性),要么误把 ZIP 加密当视频加密。
openssl_encrypt() 直接加密整个 MP4 文件 → 输出乱码,无法播放zip_entry_open() 包一层密码 ZIP → 用户解压后仍是明文 MP4,密码只防搬运,不防解压后观看取决于你要防谁:
立即学习“PHP免费学习笔记(深入)”;