thinkphp6 使用FFMpeg获取视频信息

news/2024/10/6 1:50:15/文章来源:https://www.cnblogs.com/wjs2019/p/18281214

1.本地安装 FFMpeg,官网下载地址:https://ffmpeg.org/download.html#build-windows

 

 解压后,把文件夹放到自定义目录,添加系统变量

 

2.安装依赖,composer.json 添加

"php-ffmpeg/php-ffmpeg": "^0.19.0",

3.封装class类

<?php
namespace app\api\controller;use FFMpeg\FFMpeg;
use think\facade\Config;
use FFMpeg\Coordinate\TimeCode;/*** FFMpeg处理音视频*/
class Media extends Common
{/*** 获取视频时长 单位:秒* @param string $oriPath* @return string*/public function videoDuration(string $oriPath=''): string{$config = ['ffmpeg.binaries' => Config::get('app.app_ffmpeg'),'ffprobe.binaries' => Config::get('app.app_ffprobe')];$ffmpeg = FFMpeg::create($config);$video = $ffmpeg->open($oriPath);$duration = $video->getStreams()->first()->get('duration');return bcdiv($duration,1,0);}/*** 获取视频封面图(视频第一帧)* @param string $oriPath* @return string*/public function videoCoverImage(string $oriPath=''): string{try {$config = ['ffmpeg.binaries' => Config::get('app.app_ffmpeg'),'ffprobe.binaries' => Config::get('app.app_ffprobe')];$ffmpeg = FFMpeg::create($config);$video = $ffmpeg->open($oriPath);//获取视频第一帧$frame = $video->frame(TimeCode::fromSeconds(1));$imgDir = $this->imgPath . '/' . date('Ymd');if(!is_dir('.'.$imgDir)){mkdir('.'.$imgDir, 0755, true);}//保存图片$imgPath = $imgDir . '/' . buildFileName().'.jpg';$frame->save('.'.$imgPath);echo $imgPath;die;$cos = new Cos();$res = $cos->uploadStaticFile($imgPath,'.'.$imgPath);if($res['msg']!='success'){return '';}unlink('.'.$imgPath);return $imgPath;}catch (\Exception $e){return '';}}/*** 获取音视频基本信息*/public function getVideoInfo($file){$command = sprintf('F:\work\ffmpeg-7.0.1\bin\ffmpeg -i "%s" 2>&1', $file);  //你的ffmpeg路径
ob_start();passthru($command);$info = ob_get_contents();ob_end_clean();$data = array();if (preg_match("/Duration: (.*?), start: (.*?), bitrate: (\d*) kb\/s/", $info, $match)) {$data['duration'] = $match[1]; //播放时间$arr_duration = explode(':', $match[1]);$data['seconds'] = $arr_duration[0] * 3600 + $arr_duration[1] * 60 + $arr_duration[2]; //转换播放时间为秒数$data['start'] = $match[2]; //开始时间$data['bitrate'] = $match[3]; //码率(kb)
        }if (preg_match("/Video: (.*?), (.*?), (.*?)[,\s]/", $info, $match)) {$data['vcodec'] = $match[1]; //视频编码格式$data['vformat'] = $match[2]; //视频格式$data['resolution'] = $match[3]; //视频分辨率$arr_resolution = explode('x', $match[3]);$data['width'] = $arr_resolution[0];@$data['height'] = $arr_resolution[1];}if (preg_match("/Audio: (\w*), (\d*) Hz/", $info, $match)) {$data['acodec'] = $match[1]; //音频编码$data['asamplerate'] = $match[2]; //音频采样频率
        }if (isset($data['seconds']) && isset($data['start'])) {$data['play_time'] = $data['seconds'] + $data['start']; //实际播放时间
        }$data['size'] = filesize($file); //文件大小return $data;}
}

4.本地测试

 public function testVideo(){$path = base_path()."/test.mp4";$media = new Media();
//        $img_url = $media->videoCoverImage($path);$video_len = $media->videoDuration($path);
//        $videoInfo = $media->getVideoInfo($path);
        dump($video_len . '秒');}

获取视频时长:

 

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

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

相关文章

JDK导入Lets Encrypt根证书

项目在调用https接口时报错:PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target 原因可能是更新换新证书后,HTTPS 域名的公钥证书不在 JDK/JRE 的证书库中,被Java认为是…

element plus 日历组件默认中文样式,配置日期周一为周起始日

element ui 或者 plus 其实都是西方的展示方式,日立组件的周日视为每一周的开始日期,我们则是周日为每周的最后一天。那咱们要改成周一为每周的开始日期,如下图:elementui 是可以直接属性配置的,element plus不得行,但是配置下面代码到main.ts就可以了~ import ElementPl…

Codeforces Global Round 26 A~C2

惹啊啊啊啊,这场做得我发昏,最近总感觉不在状态,但还是再在冲击1600-1800的题目. A. Strange Splitting---------------------------------题解--------------------------------------------------- 给你一个数组,让你自己构造一个RB字符串让R位置的数组中的数字的最大值-…

搭建工程之一 eclipse 中基于 maven 的 webapp工程能基于tomcat运行

一、背景作为开发人员,开发的web(运行在tomcat 容器中)希望能够在本地开发工具(eclipse)中运行调试,加快开发测试进度。 二、操作步骤 1、创建maven工程 在 eclipse 上右键,选择"New"---"Other" --- "Maven" ---- " Maven Project &…

【PythonGIS】基于Geopandas和Shapely计算矢量面最短路径

在GIS进行空间分析时经常会需要计算最短路径,我也是最近在计算DPC的时候有这方面的需求,刚开始直接是用面的中心点求得距离,但其对不规则或空洞面很不友好。所以今天跟大家分享一下基于Geopandas和Shapely计算矢量面最短路径,这里的最短即点/边的最短!​ 在GIS进行…

ls 设置颜色

1 查看别名对应的真实命令 2 设置颜色 格式: alias 别名=命令 示例 3 取消颜色 示例

主键Id自增,如何获取Id(Dapper)

这里用的是Dapper,以前用EF的时候好像有用到过db.savechanges(). 但是项目中没有这个,所以用以下的方法去获取id 背景:涉及到多表入库,需要获取主表的Id,所以用到了这个(timeFields 可以忽略)/// <summary>/// 单个添加/// </summary>/// <typeparam name…

JDK、Tomcat、Maven配置

一、JDK安装及配置 1.下载地址:https://www.oracle.com/java/technologies/downloads/2.下载后直接本地安装,选择路径默认即可,类似如下路径:C:/Program Files/Java/jdk_1.8.0_301 3. 配置环境变量路径:程序->计算机->右键->属性->高级系统设置->高级->…

VSCode + Qt + QMake 开发编译环境搭建

鉴于Qt官方IDE太过难用,VSCode+各种插件功能强大,遂采用VSCode来写Qt项目; 本博客在 Windows 平台进行指导操作,Mac、Linux 平台配置方式类似,学习其本质就可。前置准备VSCode,最新版本即可 本地 Qt 环境,版本随意,本文主要针对较老版本使用Qmake构建系统的项目环境变…