php实现视频流替换
PHP实现视频流替换的方法
使用文件流处理
通过PHP的fopen和fread函数读取视频文件并输出流

$file = 'path/to/video.mp4';
$fp = @fopen($file, 'rb');
header("Content-Type: video/mp4");
header("Content-Length: " . filesize($file));
fpassthru($fp);
exit;
使用HTTP范围请求处理
支持断点续传的视频流处理方式

$file = 'replacement_video.mp4';
$filesize = filesize($file);
$offset = 0;
$length = $filesize;
if (isset($_SERVER['HTTP_RANGE'])) {
preg_match('/bytes=(\d+)-(\d+)?/', $_SERVER['HTTP_RANGE'], $matches);
$offset = intval($matches[1]);
$length = isset($matches[2]) ? intval($matches[2]) - $offset + 1 : $filesize - $offset;
header('HTTP/1.1 206 Partial Content');
header("Content-Range: bytes $offset-" . ($offset + $length - 1) . "/$filesize");
}
header("Content-Type: video/mp4");
header("Accept-Ranges: bytes");
header("Content-Length: $length");
$fp = fopen($file, 'rb');
fseek($fp, $offset);
echo fread($fp, $length);
fclose($fp);
使用FFmpeg进行实时转码
需要服务器安装FFmpeg,实现实时转码输出
$videoPath = 'input.mp4';
$command = "ffmpeg -i $videoPath -f mp4 -movflags frag_keyframe+empty_moov - 2>/dev/null";
header('Content-Type: video/mp4');
passthru($command);
视频代理实现
通过PHP作为中间代理获取并转发远程视频流
$remoteUrl = 'http://example.com/original.mp4';
$context = stream_context_create(['http' => ['method' => 'GET']]);
$remoteStream = fopen($remoteUrl, 'rb', false, $context);
header('Content-Type: video/mp4');
while (!feof($remoteStream)) {
echo fread($remoteStream, 8192);
ob_flush();
flush();
}
fclose($remoteStream);
注意事项
- 确保服务器有足够的内存处理大文件
- 设置正确的MIME类型(video/mp4、video/webm等)
- 大文件传输时考虑使用chunked编码
- 对于私有视频,添加适当的认证和授权检查
- 考虑使用X-Sendfile等更高效的文件传输方式






