Laravel上传视频后裁剪前20秒并保存至指定目录求助
使用 protonemedia/laravel-ffmpeg 裁剪视频前20秒并保存至指定目录
核心实现思路
利用包内置的take()方法快速截取前N秒视频,或者通过from()+to()精确控制时间范围,再将处理后的视频导出到目标目录。
完整代码示例
假设你已经获取到前端上传的视频文件,以下是控制器中的实现代码:
use Illuminate\Http\Request; use Illuminate\Support\Facades\File; use ProtoneMedia\LaravelFFMpeg\Support\FFMpeg; use FFMpeg\Format\Video\X264; public function processVideo(Request $request) { // 验证上传文件 $request->validate([ 'video' => 'required|mimes:mp4,mov,avi|max:10240', // 按需调整大小限制 ]); $uploadedFile = $request->file('video'); $fileExt = $uploadedFile->getClientOriginalExtension(); $uniqueName = uniqid() . '.' . $fileExt; // 1. 保存原视频到原始目录(可选,若不需要保留原视频可跳过) $originalDir = storage_path('app/public/videos/original'); File::ensureDirectoryExists($originalDir); $uploadedFile->move($originalDir, $uniqueName); // 2. 裁剪前20秒并保存到目标目录 $croppedDir = storage_path('app/public/videos/cropped'); File::ensureDirectoryExists($croppedDir); // 方案一:使用take()快速截取前20秒 FFMpeg::fromDisk('public') ->open("videos/original/{$uniqueName}") ->take(20) // 截取从0开始的20秒内容 ->export() ->toDisk('public') ->inFormat(new X264()) // 指定输出格式为H.264编码的MP4 ->save("videos/cropped/cropped_{$uniqueName}"); // 方案二:使用from()+to()精确控制时间范围(效果和take(20)一致) // FFMpeg::fromDisk('public') // ->open("videos/original/{$uniqueName}") // ->from(0) // ->to(20) // ->export() // ->toDisk('public') // ->inFormat(new X264()) // ->save("videos/cropped/cropped_{$uniqueName}"); // 返回裁剪后视频的访问路径(需先执行php artisan storage:link创建软链接) return response()->json([ 'success' => true, 'cropped_video_url' => asset("storage/videos/cropped/cropped_{$uniqueName}") ]); }
注意事项
- 配置FFmpeg路径:确保
config/ffmpeg.php中已正确设置FFmpeg和FFprobe的可执行文件路径,若使用环境变量则在.env中配置FFMPEG_PATH和FFPROBE_PATH。 - 存储软链接:执行
php artisan storage:link创建公共存储目录的软链接,否则无法通过Web访问裁剪后的视频。 - 大文件处理:若处理大视频,建议将任务放入队列避免请求超时,只需在导出链中添加
->onQueue()方法即可。 - 自定义参数:如需调整视频质量、分辨率等,可通过
addFilter()方法添加FFmpeg原生参数,例如:->addFilter(['-vf', 'scale=1280:720']) // 调整分辨率为720P ->addFilter(['-b:v', '1M']) // 设置视频码率为1Mbps
内容的提问来源于stack exchange,提问作者Vinod
相关产品推荐
相关产品推荐

