PHP自动获取视频时长的方法

news2024/12/28 21:09:13

摘要

最近在给客户开发短视频项目模块中遇到自动获取上传视频的时长并用于外部展示的需求。
刚开始想到用比较笨的方法,就是上传之前手动写入视频文件的大小,无奈嫌麻烦,寻求其它方法。

也是一个比较笨的方法—— ffmpeg

通过下载 ffmpeg,在面板中安装 PHP 5.6,并放开 exec 函数。在建立的新站点中,使用 PHP5.6 版本。
为了安全 PHP 5.6 允许执行外部程序,且其他站点不使用 PHP 5.6 版本,由 PHP 程序执行 ffmpeg,获取时间时长并存储到数据库中。

1、下载 ffmpeg

打开 https://www.gyan.dev/ffmpeg/builds/
在这里插入图片描述

点击左侧导航菜单中的 release builds,在右侧,找到,ffmpeg-release-essentials.zip ,点击以下载。

根据需要下载工具,点击左侧导航菜单中的 tools,在右侧,找到,ffmpeg-tools.zip ,点击以下载。

包含的工具有:
aviocat crypto_bench cws2fws ffescape ffeval ffhash fourcc2pixfmt graph2dot ismindex pktdumper probetest qt-faststart seek_print sidxindex venc_data_dump zmqsend

将压缩包中的 bin 目录解压,如存放在 d:\ffmpeg\bin 中。

2、设置环境变量
在“此电脑”中,点击右键,选择“属性”,之后选择“高级系统设置”。
在“高级选择卡”中点击“环境变量”,在“系统变量”中,找到“Path”,双击编辑后,添加新的环境变量值,如 d:\ffmpeg\bin。

3、创建站点

绑定的域名,填写,127.0.0.2(只用于内部访问),PHP 版本设置为 5.6,且在禁用函数中,移除 exec。

编辑 .user.ini,增加站点目录,ffmpeg 程序目录

open_basedir="d:/wwwroot/syncvideoinfo/;D:/wwwroot/zhandian/;D:/ffmpeg/bin/;C:/Windows/Temp/;C:/Temp/;D:/BtSoft/temp/session/"

4、使用 GetVidoSize.php

因为需要设置 .env 所在目录,及解析视频地址

之后读取数据库中存储的视频地址,并获取时间,然后,写入到数据库中

<?php
/**
 * 获取视频时间长度
 */

class GetVidoSize
{
    /** @var string 锁文件路径 */
    private $lockFile;
    /** @var string env 配置文件路径 */
    private $dbEnvFile;
    /** @var string env 待解析视频目录 */
    private $parseVideoDir;

    function __construct()
    {
        $this->lockFile      = "./sync.lock";
        $this->dbEnvFile     = "../kaoshi/.env";
        $this->parseVideoDir = "../kaoshi/public";
    }

    public function canSync($write = false, $val = 0)
    {

        if ($write) {
            return file_put_contents($this->lockFile, $val) ? true : false;
        }
        $data = file_get_contents($this->lockFile);
        if ($data) {
            return false;
        } else {
            return true;
        }
    }

    public function getVideoMins($file)
    {
        $command = "ffmpeg -i " . $file . " 2>&1";
        exec($command, $output);
        // 从输出中提取视频信息

        $line = implode('', $output);

        // 提取视频时长
        if (preg_match("/Duration: (.*?), /", $line, $matches)) {
            $time = explode(':', $matches[1]);
            return (intval($time[0]) * 60 * 60) + intval($time[1]) * 60 + intval($time[2]);
        }

        return 0;

    }

    /**
     * @throws Exception
     */
    public function sync()
    {
        $res = [
            'count' => 0,
            'list'  => [],

        ];

        if (!$this->canSync()) {
            throw new Exception("Please hold on ...");
        }
        $this->canSync(true, date('Y-m-d H:i:s'));
        $dbConfig = parse_ini_file($this->dbEnvFile, true);

        try {
            // 创建连接
            $conn = new PDO("mysql:host={$dbConfig['database']['hostname']};dbname={$dbConfig['database']['database']}",
                $dbConfig['database']['username'],
                $dbConfig['database']['password']);
            // 设置 PDO 错误模式为异常
            $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

            $list         = $conn->query("SELECT id,moive_file FROM fa_exam_course_movie where mins=0");
            $res['count'] = count($list->rowCount() > 0 ? $list : []);
            foreach ($list as $row) {
                $t   = time();
                $sec = $this->getVideoMins($this->parseVideoDir . $row['moive_file']);
                // SQL 更新语句
                $sql = "update fa_exam_course_movie set mins=:sec,updatetime=:t where id=:id";

                // 预处理 SQL 语句
                $stmt = $conn->prepare($sql);

                // 绑定参数
                $stmt->bindParam(':sec', $sec);
                $stmt->bindParam(':t', $t);
                $stmt->bindParam(':id', $row['id']);

                // 执行更新操作
                $stmt->execute();
                $res['list'][] = [
                    'id'         => $row['id'],
                    'moive_file' => $row['moive_file'],
                    'length'     => $sec,
                    'status'     => $stmt->rowCount(),

                ];

            }

        } catch (PDOException $e) {
            throw new Exception($e->getMessage());
        }

        // 关闭连接
        $conn = null;
        $this->canSync(true, 0);
        return $res;
    }
}

try {
    $data = (new SyncVideo())->sync();
    echo date('Y-m-d H:i:s'), " count: ", $data['count'], PHP_EOL;
    foreach ($data['list'] as $v) {
        echo $v['id'], "\t", $v['moive_file'], "\t", $v['length'], "\t", $v['status'], PHP_EOL;
    }
} catch (Exception $e) {
    echo $e;
}
// 程序正常退出
exit(0);

5、增加计划任务

任务类型为,访问 URL,每1分钟访问一次,地址为 http://127.0.0.1/GetVidoSize.php
OK 到此就完成了,虽然说方法还是有点笨 但是至少可以实现。

版权声明 草邦软件开发 草邦CMS系统 草邦办公管理系统 草邦媒介资源系统
本软件不提供任何形式的明示或暗示担保,包括但不限于对适销性,特定目的的适用性和非侵权性的担保。无论是由于软件,使用或其他方式产生的,与之有关或与之有关的合同,侵权或其他形式的任何索赔,损害或其他责任,作者或版权所有者概不负责。

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

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

相关文章

vue的优缺点有那些 组件常用的有那些?

优点&#xff1a; 组件化开发&#xff0c;提升效率&#xff0c;方便复用&#xff0c;便于协同开发单页面路由易于结合其他的第三方库丰富的api方法轻量高效,虚拟DOMMVVM&#xff0c;数据驱动视图轻量级的框架 缺点&#xff1a; 缺少高阶教程和文档生态环境不如angular和re…

ChatGPTGPT4科研应用、数据分析与机器学习、论文高效写作、AI绘图技术教程

原文链接&#xff1a;ChatGPTGPT4科研应用、数据分析与机器学习、论文高效写作、AI绘图技术教程https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247598506&idx2&sn14f96667bfbeba5f51366a1f019e3d64&chksmfa82004dcdf5895bba2784ba10f6715f6f5e4c59c9b1…

ElasticSearch之数据建模

写在前面 本文看下es数据建模相关的内容。 1&#xff1a;什么是数据建模 数据建模是对真实数据的一种抽象&#xff0c;最终映射为计算机形式的表现。其包括如下三个阶段&#xff1a; 1&#xff1a;概念模型 2&#xff1a;逻辑模型 3&#xff1a;数据模型2&#xff1a;es数据…

此站点正在尝试打开 ,chrome/edge 允许http网站打开url schema

正常https链接会有首次允许选项 但http没有&#xff0c;每次都会弹出&#xff0c;非常烦人。 Chrome / Edge 配置 地址栏输入 chrome://flags/搜索Insecure origins treated as secure, 配置允许网站&#xff0c;需要协议和端口再次跳转会显示始终允许选项

(附源码)基于Spring Boot和Vue的前后端分离考研资料分享平台的设计与实现

前言 &#x1f497;博主介绍&#xff1a;✌专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f447;&#x1f3fb; 精彩专栏 推荐订阅&#x1f447;&#x1f3fb; 2024年Java精品实战案例《100套》 &#x1f345;文末获取源码联系&#x1f345; &#x1f31…

【Godot4.2】2D辅助类Geometry2D入门

概述 Godot4.2提供了一个名叫Geometry2D的类。它提供了一些用于2D几何图形如多边形&#xff08;Polygon&#xff09;、折线&#xff08;PolyLine&#xff09;相关的函数&#xff0c;可以方便实现诸如多边形与多边形或多边形与折线的布尔运算、求交点等。 这是一个非常强大的2…

目标控制器数字孪生系统的研究与设计

文章来源&#xff1a;铁路计算机应用,2023,32(10):36-41. 作者&#xff1a;许婧&#xff0c;杨硕&#xff0c;季志均 摘要&#xff1a;随着目标控制器&#xff08;OC&#xff0c;Object Controller&#xff09;系统在轨道交通领域的推广应用&#xff0c;其硬件投入较高、研发…

css background-color属性无效

因为工作需要&#xff0c;最近在帮H5同事开发几个页面&#xff0c;在使用H5进行如下布局的时候&#xff0c;发现设置 background-color为白色无效。 代码如下&#xff1a; <div class "bottomBar"><div style"position: fixed; left: 20px;">…

解决arco-design下拉框回显id的问题

问题描述 下拉框回显选项中没有的选项&#xff0c;就会出现以下情况&#xff0c;只能把uid回显上去 解决方案 使用ui框架自带的属性fallback-option 用法 按以上操作&#xff0c;即可解决选择框回显uid问题

软考91-上午题-【操作系统】-线程

一、线程的定义 传统的进程有两个基本属性: 可拥有资源的独立单位&#xff1b;可独立调度和分配的基本单位。 引入线程的原因是进程在创建、撤销和切换中&#xff0c;系统必须为之付出较大的时空开销&#xff0c;故在系统中设置的进程数目不宜过多&#xff0c;进程切换的频率…

Day43:WEB攻防-PHP应用SQL注入符号拼接请求方法HTTP头JSON编码类

目录 PHP-MYSQL-数据请求类型 PHP-MYSQL-数据请求方法 PHP-MYSQL-数据请求格式 知识点&#xff1a; 1、PHP-MYSQL-SQL注入-数据请求类型 2、PHP-MYSQL-SQL注入-数据请求方法 3、PHP-MYSQL-SQL注入-数据请求格式 PHP-MYSQL-数据请求类型 SQL语句由于在黑盒中是无法预知写法的…

基于python+vue的BBS论坛系统flask-django-nodejs-php

本系统为用户而设计制作BBS论坛系统&#xff0c;旨在实现BBS论坛智能化、现代化管理。本BBS论坛自动化系统的开发和研制的最终目的是将BBS论坛的运作模式从手工记录数据转变为网络信息查询管理&#xff0c;从而为现代管理人员的使用提供更多的便利和条件。使BBS论坛系统数字化、…

使用阿里CICD流水线打包Vue项目到阿里的docker镜像私仓,并自动部署到服务器启动服务

文章目录 使用阿里CICD流水线打包Vue项目到阿里的docker镜像私仓&#xff0c;并自动部署到服务器启动服务1、功能实现原理大家可以看我之前的两篇文章2、打包vue项目和打包咱们的Java项目过程差不多相同&#xff0c;大家可以看着上面的Java打包过程进行实验&#xff0c;下面是v…

关于短群签名论文阅读

参考文献为2004年发表的Short Group Signatures 什么群签名&#xff1f; 群签名大致就是由一组用户组成一个群&#xff0c;其中用户对某条消息的签名&#xff0c;改签名不会揭示是哪一个用户签署的&#xff0c;签名只能表明该消息确实是来自该群的签名。对于群还有一个群管理者…

VTK9.2.0+Qt5.14.0 绘制点云

背景 为了显示结构光重建后的点云&#xff0c;开发QT5.14.0VTK9.2.0的上位机软件&#xff0c;用于对结构光3D相机进行控制&#xff0c;并接收传输回来的3D数据&#xff0c;显示在窗口中。 配置QT和VTK VTK9.2.0下载源码&#xff0c;用Cmake编译&#xff0c;编译好的VTK9.2.0…

Nacos介绍和Eureka的区别

Nacos&#xff08;全称为 Alibaba Cloud Nacos&#xff0c;或简称为 Nacos&#xff09;是一个开源的分布式服务发现和配置管理系统。它由阿里巴巴集团开发并开源&#xff0c;旨在帮助开发人员简化微服务架构下的服务注册、发现和配置管理。 1、Nacos 提供了以下主要功能&#…

短视频矩阵系统----源头开发

短视频矩阵源码技术开发要求及实现流程&#xff1a; 短视频矩阵开发要求具备视频录制、编辑、剪辑、分享等基本功能&#xff0c;支持实时滤镜、特效、音乐等个性化编辑&#xff0c;能够实现高效的视频渲染和处理。开发流程主要包括需求分析、技术选型、设计架构、编码实现、测试…

Binance labs孵化的Swan Chain明牌空投测试网零撸教程

简介&#xff1a;Swan Chain 是一个 Layer2云计算网络&#xff0c;可以将数据、计算、带宽和支付集成到一个套件&#xff0c;为Web3项目提供全面的解决方案。 相关概念&#xff1a;云计算、layer2、infrastructure 融资信息&#xff1a;项目在去年获得bi’an领投的300万美元融…

Flask 与小程序 的图片数据交互 过程及探讨研究学习

今天不知道怎么的&#xff0c;之前拿编程浪子地作品抄过来粘上用好好的&#xff0c;昨天开始照片突的就不显示了。 今天不妨再耐味地细细探究一下微信小程序wxml 和flask服务器端是怎么jpg图片数据交互的。 mina/pages/food/index.wxml <!--index.wxml--> <!--1px …