Laravel 10.x 里如何使用ffmpeg

原理上很简单,就是使用命令行去调用ffmpeg,然后分析一下输出是不是有错误。

安装

首先安装 symfony/process,主要用于包装一下,用来代替 exec, passthru, shell_exec and system 。

composer require symfony/process
composer require symfony/filesystem

要注意 Laravel 10.x 是锁定 symfony 6.4的,所以无法安装最新的 7.0 ,但用起来也没什么问题。

创建服务

照例创建服务,服务类:VideoMakerService,接口类:VideoMakerContract,服务提供类:VideoMakerProvider,快捷名称:videomaker,Facade类:VideoMaker

参考 保姆级教程:Laravel中添加Service

暂时就提供一个服务,把图片生成几秒视频。

    public function imageToBaseVideo(string $imageFile, string $targetFile, float $duration): bool{// $workingDir=$this->ffmpegTempDir;$params=[$this->ffmpegFile,'-loop', '1','-framerate', '30','-i', $imageFile,'-vf', 'scale=1080:1920:force_original_aspect_ratio=decrease,pad=1080:1920:(ow-iw)/2:(oh-ih)/2,setsar=1','-c:v', 'libx264','-t', $duration,'-y',$targetFile,];return ExecHelper::run($params);}

这里使用了 ExecHelper 来运行,只是对Process做了包装

class ExecHelper{public static function run(array $params){$success=false;$process = new Process($params);$code=$process->run(function ($type, $buffer): void {if (Process::ERR === $type) {Log::debug('ERR > ', $buffer);} else {Log::debug('OUT > ', $buffer);}});$success=$code===0;return $success;}
}

创建命令行

命令行类:ProcessVideo

    public function handle(VideoMakerContract $videoMakerContract){$imageFile = $this->argument('imageFile');$targetFile = $this->argument('targetFile');$duration = $this->option('duration');// print params$this->info('imageFile: '.$imageFile.' , targetFile: '.$targetFile.' , duration: '.$duration);// convert to absolute path$imageFile=PathHelper::toAbsolutePath($imageFile);// validate imageFileif(!file_exists($imageFile)){$this->error('imageFile not exists');return;}$targetFile=PathHelper::toAbsolutePath($targetFile);// validate targetFileif(!file_exists($targetFile)){$this->error('targetFile not exists');return;}// validate durationif(!is_numeric($duration)){$this->error('duration must be numeric');return;}$success=$videoMakerContract->imageToBaseVideo($imageFile, $targetFile, $duration);$this->info('success: '.$success);}

参考:保姆级教程:Laravel里如何创建自己的命令行 

这里面用到PathHelper就是简要地补全一下路径

class PathHelper{public static function toAbsolutePath(string $path): string{return Path::makeAbsolute($path, self::currentPath());}public static function currentPath(): string{return realpath('.');}
}

准备好图片

复制任意一张图片到 storage/app/tmp/t.jpg

运行命令行

./artisan process:video ./storage/app/tmp/t.jpg ./storage/app/tmp/t.mp4 --duration=5

 

轻松生成 t.mp4 ,ffmpeg 的参数可以参考专栏里其他文章

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/641324.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PowerShell install 一键部署grafana

grafana 前言 Grafana 是一款开源的数据可视化和监控仪表盘工具。它提供了丰富的数据查询、可视化和报警功能,可用于实时监控、数据分析和故障排除等领域。 通过 Grafana,您可以连接到各种不同的数据源,包括时序数据库(如 Prometheus、InfluxDB)和关系型数据库(如 MySQ…

linux性能优化-磁盘I_O优化

1.文件系统 1.1.文件系统的工作原理 文件系统是在磁盘的基础上,提供了一个用来管理文件的树状结构。 接下来我们就看看Linux 文件系统的工作原理。 1.1.1索引节点和目录项 在 Linux 中一切皆文件 ,文件系统,本身是对存储设备上的文件,进行组织管理的…

【Linux】—— 共享内存

本期我将要带大家学习的是有关进程间通信的另一种方式——共享内存。共享内存是一种用于进程间通信的高效机制,允许多个进程访问和操作同一块内存区域。 目录 (一)深刻理解共享内存 1.1 概念解释 1.2 共享内存原理 1.3 共享内存数据结构 …

基于SpringBoot的药品管理系统

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式 🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 &…

2024年华为OD机试真题-最大坐标值-Python-OD统一考试(C卷)

题目描述: 小明在玩一个游戏,游戏规则如下: 在游戏开始前,小明站在坐标轴原点处(坐标值为0)。 给定一组指令和一个幸运数,每个指令都是一个整数,小明按照指定的要求前进或者后退指定的步数。前进代表朝坐标轴的正方向走,后退代表朝坐标轴的负方向走。 幸运数为一个整数…

【css技巧】css实现边框渐变

海鲸AI-ChatGPT4.0国内站点,支持设计稿转代码:https://www.atalk-ai.com 在CSS中实现边框渐变效果,你不能直接应用渐变到border属性上,因为CSS标准不支持这样的操作。但是,你可以使用一些技巧来模拟边框渐变的效果。以…

数据治理能解决AI疲劳问题吗?

这篇文章强调了AI疲劳开始的两个阶段,并介绍了数据质量报告等数据治理措施如何能够推动构建值得信赖和健壮的模型。 数据治理和AI疲劳听起来像是两个不同的概念,但两者之间有着内在的联系。为了更好地理解它,让我们从它们的定义开始。 数据治…

JS 将字符串‘10.3%‘ 经过运算加2转换为 ‘12.3%‘

文章目录 需求分析 需求 已知 字符串 a ‘10.3%’,现需将转换为 字符串’12.3%’ 分析 去掉百分号,将字符串转换为数字 const aNumber parseFloat(10.3%); const resultNumber aNumber 2;将结果转换为带百分号的字符串 const resultString re…

【算法题】67. 二进制求和

题目 给你两个二进制字符串 a 和 b ,以二进制字符串的形式返回它们的和。 示例 1: 输入:a "11", b "1" 输出:"100" 示例 2: 输入:a "1010", b "1011" 输出…

【OpenCV】P1 开发环境搭建

目录 OpenCV 简介OpenCV 安装*Windows* 下载安装*Macos* 下载安装*Ubuntu* 下载安装 OpenCV is the word’s biggest computer vision library. It’s open source, contains over 2500 algorithms and is operated by the non-profit Open Source Vision Foundation. – From …

灰度图像的自动阈值分割

第一种:Otsu (大津法) 一、基于cv2的API调用 1、代码实现 直接给出相关代码: import cv2 import matplotlib.pylab as pltpath r"D:\Desktop\00aa\1.png" img cv2.imread(path, 0)def main2():ret, thresh1 cv2.…

springboot项目之微信小程序授权登陆

引言 现实工作中小程序微信授权是最常见的需求,多少情况根据文档说明来基本上能够获取微信用户的openid。由于政策的改变,获取不到 微信头像和昵称,需要前端上传相关信息。 实战 简洁的两三行代码即可实现 PostMapping("wxMinReg"…

【CentOS】Linux 在线帮助文档命令:help、man 命令与文档汉化

目录 1、Linux 的命令行模式 2、help 命令 3、man 命令 4、man 命令输出文档汉化 注:本文档使用 Linux 版本为 CentOS 7.9 [swadianlocalhost ~]$ cat /etc/centos-release CentOS Linux release 7.9.2009 (Core) 1、Linux 的命令行模式 一般情况下&#xff0…

喜讯 | 华院计算摘得“2023大数据产业年度创新技术突破”奖

2024年1月17日, 由数据猿和上海大数据联盟主办,上海市经济和信息化委员会、上海市科学技术委员会指导的“第六届金猿季&魔方论坛——大数据产业发展论坛”在上海市四行仓库举行。论坛以“小趋势大未来”为主题,围绕大数据产业的各个领域展…

关于C# 使用 sqlite 映射实体类笔记

1、安装SQLite 在 nuget 搜索 System.Data.SQLite 安装2、在 app.conifg 文件中添加如下信息 <provider invariantName"System.Data.SQLite" type"System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" />解决问题&#xff1a;…

MySQL-SQL-DQL

DQL-介绍 DQL-语法 基本查询 1、查询多个字段 2、设置别名 3、去除重复记录 条件查询 1、语法 2、条件 聚合函数 1、介绍 2、常见的聚合函数 3、语法 分组查询 1、语法 2、where与having区别 排序查询 1、语法 2、排序方式 分页查询 1、语法 DQL-执行顺序

ubuntu 安装protobuf

apt 安装 sudo apt install protobuf-compiler 编译安装 – 方式1 资料链接&#xff1a;ubuntu环境 安装ncnn_ubuntu ncnn_jbyyy、的博客-CSDN博客 git clone https://github.com/google/protobuf.git cd protobuf git submodule update --init --recursive ./autogen.sh …

LeetCode59 螺旋矩阵 II

螺旋矩阵 II 循环不变量的应用 给你一个正整数 n &#xff0c;生成一个包含 1 到 n2 所有元素&#xff0c;且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;[[1,2,3],[8,9,4],[7,6,5]] 示例 2&#xff1…

关于php8的数据类型转换

目录 1、数据类型介绍 1.1 简单数据类型&#xff1a; 1.2 复合数据类型&#xff1a; 1.3 特殊数据类型&#xff1a; 2、数据类型转换 2.1 自动转换&#xff1a; 2.2 强制&#xff08;手动&#xff09;转换&#xff1a; 3、验证数据类型途径 &#xff08;1&#xff09;var…

[自用代码]基于LSTM的广州车牌售价预测

文章目录 1. 数据2. 代码 明天是拍牌日了&#xff0c;用AI协助生成了一段时间序列预测代码&#xff0c;主要是用来预测明天车牌均价。其实做的挺low的&#xff0c;没有考虑多维数据之间的关系以及社会事件影响&#xff0c;仅仅是单步预测&#xff0c;偏差是挺大的&#xff0c;符…