php 读取视频流(mp4视频文件),快速读取视频解决方案(案例及配置)

在网站中,时长会有视频类的文件,但在读取视频时非常慢,现在处理流程和方案分享出来。

一、liunx 配置

1.1、打开文件 /etc/sysctl.conf ,配置参数如下:

bash 复制代码
net.core.rmem_max = 2500000
net.core.wmem_max = 2500000
net.core.rmem_default = 2097152
net.core.wmem_default = 2097152
net.ipv4.tcp_rmem = '4096 87380 2500000'
net.ipv4.tcp_wmem = '4096 16384 2500000'
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 4096
net.ipv4.tcp_fin_timeout = 30
net.ipv4.ip_forward = 1
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.tcp_fastopen=3
net.core.rmem_max=134217728
net.core.wmem_max=134217728

然后执行 sysctl -p 生效

1.2、网络设置

bash 复制代码
查看网卡的内容(默认1500):
ifconfig 
设置网卡最大帧:
ifconfig eth0 mtu 9000

1.3、打开文件数

编辑 /etc/security/limits.conf 文件,打开文件后在最后面加上

bash 复制代码
* soft nofile 1024000 
* hard nofile 1024000

二、php 读取视频流

按文件路径参数传递,输出视频流

php 复制代码
function viewVideoStream ($video_url) {
	// 检查文件
	 if (!file_exists($video_url)) {
	     header('HTTP/1.1 404 Not Found');
	     exit('Video not found');
	 }
	 $size = filesize($video_url);
	 $start = 0;
	 $end = $size - 1;
	 $length = $size;
	 // 定义支持的视频格式及其对应的MIME类型
	 $video_types = [
	     'mp4'  => 'video/mp4',
	     'mov'  => 'video/quicktime',
	     'avi'  => 'video/x-msvideo',
	     'mkv'  => 'video/x-matroska',
	     'webm' => 'video/webm',
	     'flv'  => 'video/x-flv',
	 ];
	 $extension = pathinfo($video_url, PATHINFO_EXTENSION);// 获取文件扩展名
	 if (isset($_SERVER['HTTP_RANGE'])) {  // 解析 Range 头
	     preg_match('/bytes=(\d*)-(\d*)?/', $_SERVER['HTTP_RANGE'], $matches);
	     $start = (int)($matches[1] ?? 0);
	     $end = isset($matches[2]) && $matches[2] !== '' ? (int)$matches[2] : $end;
	     $length = $end - $start + 1;
	     // 范围验证
	     if ($start > $end || $start >= $size) {
	         header('HTTP/1.1 416 Range Not Satisfiable');
	         header("Content-Range: bytes */{$size}");
	         exit;
	     }
	     header('HTTP/1.1 206 Partial Content');
	     header("Content-Range: bytes {$start}-{$end}/{$size}");
	 }
	 header('Content-Type: ' . $video_types[$extension]);
	 header("Accept-Ranges: bytes");
	 header("Content-Length: {$length}");
	 header("Cache-Control:public, max-age=31536000",);
	 // 读取并输出文件
	 $fp = fopen($video_url, 'rb');
	 fseek($fp, $start);
	 $buffer = 1024*1024*1; // 1MB 缓冲区
	 while (!feof($fp) && ($p = ftell($fp)) <= $end) {
	     if ($p + $buffer > $end) {
	         $buffer = $end - $p + 1;
	     }
	     echo fread($fp, $buffer);
	     flush();
	 }
	 fclose($fp);
	 exit();
}
viewVideoStream ("xxx/path.mp4")
相关推荐
晴天的雨.9922 小时前
【C++算法】和为s的两个数
开发语言·数据结构·c++·算法
IvanCodes7 小时前
Python 数据处理(十三):JSON、CSV 与数据序列化
开发语言·python
aramae8 小时前
MySQL复合查询(8)
java·c语言·开发语言·后端·算法
damoluomu9 小时前
国产企业级 PHP CMS:哪些能免费商用
php
linux_cfan11 小时前
videojs v10 源代码系列解读:14 · 谓词守卫:在运行时安全地调用能力
前端·javascript·音视频
qq_25183645711 小时前
springboot vue3 开发实现 拼豆管理系统
java·开发语言·ai编程
郑州光合科技余经理12 小时前
同城外卖小程序开发:下单成功后,后台导出能不能对上用户端状态
开发语言·前端·git·后端·uni-app·php·ai编程
知识分享小能手12 小时前
C++ 学习教程,从入门到精通,C++ 入门知识 — 完整知识点(1)
开发语言·c++·学习
MyFreeIT12 小时前
Android PHP Manual
php
赛博仓鼠12 小时前
秋叶ComfyUI 3.2整合包实测:Python 3.13+Torch 2.13全栈升级,一键跑通MiniMax H3(附完整部署)
ai·ai作画·aigc·音视频