php laravel 视频以流(Stream)动态生成视频响应,不直接返回视频地址
第一步在根目录路由里routes/web.php添加路由访问
use App\Http\Controllers\Test;
use Illuminate\Support\Facades\Route;
Route::prefix("test")->group(function(){
Route::get('video/{id}', [Test::class,'video']);//视频流加载
});
//访问ip/test/video/12312
在app\Http\Controllers\Test.php新建控制器
<?php
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\DB;
use Symfony\Component\HttpFoundation\StreamedResponse;
use Exception;
class Test extends Controller
{
public function video($id){
//视频地址,base_path()是框架根目录就是
$videoPath = base_path().'/videos/1.mp4';
return new StreamedResponse(function () use($videoPath){
//打开视频文件的流
$stream = fopen($videoPath,"rb");
while (!feof($stream)){
//fread 函数将数据逐块地发送给客户端
echo fread($stream,1024*1024);
flush();//清空缓存数据
}
fclose($stream);//关闭读写流
},200,[
'Content-Type' => 'video/mp4',//告诉浏览器输出的是什么格式
'Cache-Control' => 'no-store, no-cache, must-revalidate, max-age=0',
'Pragma' => 'no-cache',
'Expires' => '0',
]);
}
}
直接访问地址就可以看到视频了,但是还是阻止不了前端可以下载视频,可以视频加密或者流媒体服务器,百度吧。我也没搞过
前端加个video就可以看了
<video id="videoPlayer" controls>
<source src="/test/video/12312" type="video/mp4">
</video>
var video = document.getElementById('videoPlayer');
// 播放视频
video.play();
// 设置音量
video.volume = 0.5; // 0.0 到 1.0 的范围