You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 08:42:39