PHP无法将文件“变成MP4”或直接加密MP4,只能通过代理输出实现访问控制;MP4加密需用FFmpeg等工具实现CENC标准,配合DRM系统,PHP仅负责鉴权与流式输出。

PHP 输出 MP4 时如何限制未授权访问
多数人所谓“加密码”,其实是防止别人直接通过 URL 下载视频(比如 https://example.com/videos/123.mp4)。PHP 无法给 MP4 文件本身加密码,但可以拦截请求、校验身份后再输出文件流。
- 把 MP4 放在 Web 根目录外(如
/var/www/private/videos/),避免被直接访问 - 用 PHP 脚本做代理:用户请求
/play.php?id=abc,PHP 检查 session 或 token 合法后,再用readfile()输出二进制流 - 务必设置正确 header:
header('Content-Type: video/mp4'); header('Content-Length: ' . filesize($mp4_path)); header('Accept-Ranges: bytes'); - 不要用
echo file_get_contents()输出大视频,容易内存溢出;改用readfile()或分块fread()
MP4 文件本身能否用 PHP 加密(AES)
可以,但浏览器无法直接播放加密后的 MP4。标准 MP4 容器不支持内置密码,所谓“加密 MP4”实际是:用 AES-128 加密 H.264/AAC 的 NALU 或 sample 数据,再配合 .m3u8 + .key 实现 HLS 加密播放——这是流媒体方案,不是单个 MP4 加密码。
- PHP 不适合做音视频加密,推荐用
ffmpeg命令行配合 key 文件:ffmpeg -i input.mp4 -c copy -f mp4 -encryption_scheme cenc -encryption_key 0123456789abcdef0123456789abcdef -encryption_kid 0123456789abcdef0123456789abcdef output_encrypted.mp4
- 上述命令生成的是 CENC(Common Encryption)格式,需搭配 DRM 系统(如 Widevine、FairPlay)解密,普通 HTML5
标签打不开 - 若只要简单混淆,可用 PHP 对 MP4 文件头后的内容做 XOR(不推荐:无安全强度,且破坏 MP4 结构,播放器大概率报错)
为什么不能用 password_protect_mp4() 这类函数
PHP 标准库没有 password_protect_mp4()、encrypt_video() 这类函数——它们不存在。网上搜到的“PHP 加密 MP4”教程,90% 是误导:要么是伪造下载链接(带一次性 token),要么是把 MP4 base64 后塞进 HTML 再 JS 解码(毫无安全性),要么误把 ZIP 加密当视频加密。
- MP4 是二进制容器格式,加密必须在编码层(如 FFmpeg)或传输层(如 HTTPS + 鉴权)实现
- 试图用
openssl_encrypt()直接加密整个 MP4 文件 → 输出乱码,无法播放 - 用
zip_entry_open()包一层密码 ZIP → 用户解压后仍是明文 MP4,密码只防搬运,不防解压后观看
最现实的“加密码”方案选哪个
取决于你要防谁:
立即学习“PHP免费学习笔记(深入)”;
- 防普通用户手输 URL 下载:用 PHP 代理 + session/token 校验 + 文件路径隔离
- 防录屏/盗链:加 Referer 检查 + 短时效 token + 视频水印(PHP 可调用 ffmpeg 插入动态文字水印)
- 防专业破解/二次分发:必须上商业 DRM(如 Bitmovin、Vimeo OTT),PHP 只负责发放 license URL
- 别碰“前端 JS 解密 MP4”或“PHP base64+eval”这类伪加密——运行时必然暴露明文,纯属心理安慰











