php laravel 视频以流(Stream)动态生成视频响应,不直接返回视频地址

发布时间 2023-09-01 15:46:14作者: 亚索会代码

第一步在根目录路由里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 的范围