监控视频片段合并完整视频|FFmpeg将多个视频片段拼接完整视频|PHP自动批量拼接合并视频
关于环境配置ffmpeg安装使用的看之前文章 哔哩哔哩缓存转码|FFmpeg将m4s文件转为mp4|PHP自动批量转码B站视频
<?php
date_default_timezone_set("PRC");
header("Content-type: text/html; charset=utf-8");
set_time_limit(0);// 遍历获取文件
function getDirFile($path = null, $deep = true)
{if (empty($path)) {return [];}$files = scandir($path);$fileItem = [];foreach ($files as $v) {$newPath = $path . DIRECTORY_SEPARATOR . $v;if ($deep && is_dir($newPath) && $v != '.' && $v != '..') {if (is_numeric($deep)) {$deep--;}$fileItem = array_merge($fileItem, getDirFile($newPath, $deep));} else if (is_file($newPath)) {$fileItem[] = $newPath;}}return $fileItem;
}// 遍历获取文件夹
function getDir($path = null, $deep = true)
{if (empty($path)) {return [];}$files = scandir($path);$dirList = [];foreach ($files as $v) {$newPath = $path . DIRECTORY_SEPARATOR . $v;if (is_dir($newPath) && $v != '.' && $v != '..') {$dirList[] = $newPath;if ($deep) {if (is_numeric($deep)) {$deep--;}$dirList = array_merge($dirList, getDir($newPath, $deep));}}}return $dirList;
}//判断文件夹是否存在,没有则新建。
if (!function_exists('mkdirs')) {function mkdirs($dir, $mode = 0777){if (is_dir($dir) || @mkdir($dir, $mode)) {return true;}if (!mkdirs(dirname($dir), $mode)) {return false;}return @mkdir($dir, $mode);}
}// 删除指定文件
function deleteFile($filename)
{// 检查文件是否存在if (file_exists($filename)) {// 尝试删除文件if (unlink($filename)) {return null;} else {return "文件删除失败";}} else {return "文件不存在";}
}/*** 操作文件夹* addtime 2020年7月17日* @param [type] $dirname 文件夹路径* @param boolean $self 是否删除文件夹本身[true是 false否] 具体看需求* @return void*/
function do_rmdir($dirname, $self = false)
{# 检查文件或目录是否存在if (!file_exists($dirname)) {return false;}# 是文件进行删除if (is_file($dirname) || is_link($dirname)) {return unlink($dirname);}# 开始读取目录$dir = dir($dirname);if ($dir) {while (false !== $entry = $dir->read()) {if ($entry == '.' || $entry == '..') {continue;}# 进行文件删除do_rmdir($dirname . '/' . $entry);}}# 关闭目录$dir->close();# 是否删除本身文件夹$self && rmdir($dirname);# 成功返回return ['code' => 200];
}// 命令参数字段映射
$cmdFiledMap = array('P' => 'path','D' => 'debug','H' => 'help',
);
// 命令行参数变量
$console = array();
if (preg_match_all('/--(\w+)(=(.*?)(?=\s--|$))?/u', implode(' ', array_slice($_SERVER['argv']/*获取命令行参数的完整字符串*/, 1)), $matches)) {$console = [];for ($i = 0; $i < count($matches[0]); $i++) {$key = $matches[1][$i];$value = $matches[3][$i];$console[$key] = $value;}foreach ($cmdFiledMap as $key => $item) {if (isset($console[$key])) {if (empty($console[$item]) && !empty($console[$key])) {$console[$item] = $console[$key];}unset($console[$key]);}}
}
// 判断是否要获取使用方法
if (empty($console) || isset($console['help']) || empty($console['path'])) {$errMsg = array('help:',' as => php index.php --path=your_resource_path --debug=0','OR',' as => php index.php --F=your_resource_path --D=1','','',);die(implode(PHP_EOL . PHP_EOL, $errMsg));
}$outputDir = dirname(__FILE__) . DIRECTORY_SEPARATOR . $console['path'] . 'Mp4';
do_rmdir($outputDir, true);
mkdirs($outputDir);
$isDebug = !empty($console['debug']);$list = getDir($console['path'], false);
if (empty($list)) {die(PHP_EOL . '空文件夹。。。');
}
$startTime = time();
foreach ($list as $key => $item) {$itemDirName = basename($item); // 目录名$fileList = getDirFile($item);$listText = array();foreach ($fileList as $keyx => $itemx) {$itemxInfo = pathinfo($itemx);$midifyTime = filemtime($itemx); // 最后一次修改时间$ext = $itemxInfo['extension'];if ($ext == 'mp4') {$listText[$midifyTime] = "file '" . basename($itemx) . "'";}}ksort($listText);$listTextPath = $item . DIRECTORY_SEPARATOR . 'list.txt';file_put_contents($listTextPath, implode(PHP_EOL, $listText));$outputFileName = $outputDir . DIRECTORY_SEPARATOR . $itemDirName . '.mp4';$cmd = "ffmpeg " . ($isDebug ? "" : "-loglevel quiet") . " -f concat -safe 0 -i {$listTextPath} -c copy {$outputFileName}";echo $cmd . PHP_EOL;shell_exec($cmd); // cmd可执行// 删除list.txt 临时文件deleteFile($listTextPath);
}echo PHP_EOL . '处理完成, 耗时:' . (time() - $startTime) . '秒';相关文章:
监控视频片段合并完整视频|FFmpeg将多个视频片段拼接完整视频|PHP自动批量拼接合并视频
关于环境配置ffmpeg安装使用的看之前文章 哔哩哔哩缓存转码|FFmpeg将m4s文件转为mp4|PHP自动批量转码B站视频 <?php date_default_timezone_set("PRC"); header("Content-type: text/html; charsetutf-8"); set_time_limit(0);// 遍历获取文件 functi…...
client-go controller-runtime kubebuilder
背景 这半年一直做k8s相关的工作,一直接触client-go controller-runtime kubebuilder,但是很少有文章将这三个的区别说明白,直接用框架是简单,但是出了问题就是黑盒,这不符合我的理念,所以这篇文章从头说起…...
【vue 如何解决响应式丢失】
响应式丢失原因 在 Vue 中,响应式丢失通常是由于以下原因导致的: 1. 使用非响应式对象或属性:在 Vue 中,只有使用 Vue 实例的 data 对象中的属性或使用 Vue.set() 方法添加的属性才是响应式的。如果使用普通对象或属性ÿ…...
Selenium alert 弹窗处理!
页面弹窗有 3 种类型: alert(警告信息)confirm(确认信息)prompt(提示输入) 对于页面出现的 alert 弹窗,Selenium 提供如下方法: 序号方法/属性描述1accept()接受2dismis…...
有关自动化的脚本思考 python 按键 javascript
start 说来其实挺巧的,去年年中的时候,有一个同组的同事,由于工作流程需要,经常会打开某一网页,填写某些信息,然后上传特定的代码。 他有一次和我闲聊,他吐槽说,他每天的时间会被这…...
CKA认证模块②-K8S企业运维和落地实战-2
CKA认证模块②-K8S企业运维和落地实战-2 K8S常见的存储方案及具体应用场景分析 k8s存储-empty emptyDir类型的Volume是在Pod分配到Node上时被创建,Kubernetes会在Node上自动分配一个目录,因此无需指定宿主机Node上对应的目录文件。 这个目录的初始内容…...
SpectralDiff论文阅读笔记
高光谱图像分类是遥感领域的一个重要问题,在地球科学中有着广泛的应用。近年来,人们提出了大量基于深度学习的HSI分类方法。然而,现有方法处理高维、高冗余和复杂数据的能力有限,这使得捕获数据的光谱空间分布和样本之间的关系具有…...
selenium基本使用、无头浏览器(chrome、FireFox)、搜索标签
selenium基本使用 这个模块:既能发请求,又能解析,还能执行js selenium最初是一个自动化测试工具,而爬虫中使用它主要是为了解决requests无法直接执行 JavaScript代码的问题 selenium 会做web方向的自动化测试appnium 会做 app方向的自动化…...
Html 引入element UI + vue3 报错Failed to resolve component: el-button
问题:Html 引入element UI vue3 ,el-button效果不出来 <!DOCTYPE html> <html> <head><meta charset"UTF-8"><!-- import Vue before Element --> <!-- <script src"https://unpkg.com/vue2/dist…...
sen2cor安装
Sen2Cor工具安装教程-百度经验 (baidu.com)...
通付盾Web3专题 | SharkTeam:Web3安全实践与创新
在Web3领域,安全漏洞、黑客攻击已愈发成为用户和投资者重点关注的领域。如何保障加密资产的安全,Web3黑暗森林中又有哪些新的攻击模式产生,SharkTeam将从一线进行分享和讨论。 我们先来看一下2023年1月到8月的安全事件数量和损失的数据统计。…...
ARM Linux 基础学习 / Ubuntu 下的包管理 / apt工具
编辑整理 by Staok。 注:在 Github 上的原版文章日后可能会更新,在其它位置发的不会跟进。文章的 Gitee 仓库地址,Gitee 访问更流畅。 Ubuntu 下的包管理 / apt工具 包管理系统的功能和优点大致相同,但打包格式和工具会因平台&a…...
springcloudalibaba入门详细使用教程
目录标题 一、简介二、SpringCloud Alibaba核心组件2-1、Nacos (配置中心与服务注册与发现)2-2、Sentinel (分布式流控)2-3、RocketMQ (消息队列)/RabbitMq/kafka2-4、Seata (分布式事务)2-5、Dubbo (RPC) 三、为什么大家看好 Spring Cloud Alibaba3-1、阿里巴巴强大的技术输出…...
C# DirectoryInfo类的用法
在C#中,DirectoryInfo类是System.IO命名空间中的一个类,用于操作文件夹(目录)。通过DirectoryInfo类,我们可以方便地创建、删除、移动和枚举文件夹。本文将详细介绍DirectoryInfo类的常用方法和属性,并提供…...
IDEA常用快捷键大全(详解)
如何在IDEA中进行内容全局查找 在idea中进行全局查找,可以使用快捷键“Ctrl Shift F”或者在菜单栏中选择Edit > Find > Find in Path。在弹出的界面中,输入要查找的内容。如果“Ctrl Shift F”这个快捷键无法实现全局查找,可以尝…...
设计模式之解释器模式
阅读建议 嗨,伙计!刷到这篇文章咱们就是有缘人,在阅读这篇文章前我有一些建议: 本篇文章大概5000多字,预计阅读时间长需要5分钟。本篇文章的实战性、理论性较强,是一篇质量分数较高的技术干货文章&#x…...
粉够荣获淘宝联盟区域理事会常务理事,携手共铸淘客新生态
淘宝联盟区域理事会于2021年成立,首届成立成都、广州、武汉,服务近2000个领军淘宝客企业,作为区域生态与官方交流重要枢纽,理事会举办近百场交流分享会,带动淘客跨域跨业态交流成长。 2023年9月7日第二届淘宝联盟理事…...
Python爬虫是否合法?
Python爬虫是否合法的问题颇具争议,主要涉及到使用爬虫的目的、操作方式以及是否侵犯了其他人的权益。本文将介绍Python爬虫的合法性问题,并提供一些相关的法律指导和最佳实践。 1. 什么是Python爬虫? Python爬虫是一种自动化程序ÿ…...
3.2 IDAPro脚本IDC常用函数
IDA Pro内置的IDC脚本语言是一种灵活的、C语言风格的脚本语言,旨在帮助逆向工程师更轻松地进行反汇编和静态分析。IDC脚本语言支持变量、表达式、循环、分支、函数等C语言中的常见语法结构,并且还提供了许多特定于反汇编和静态分析的函数和操作符。由于其…...
用python将csv表格数据做成热力图
python的开发者为处理表格和画图提供了库的支持,使用pandas库可以轻松完成对csv文件的读写操作,使用matplotlib库提供了画热力图的各种方法。实现这个功能首先需要读出csv数,然后设置自定义色条的各种属性如颜色,位置,…...
告别理论推导!用《有源滤波器的快速实用设计》手把手搞定1kHz带通滤波器(附Multisim仿真)
1kHz带通滤波器实战指南:从查表到仿真的全流程解析 在电子设计竞赛或音频信号处理项目中,带通滤波器是高频出现的核心模块。许多工程师都曾陷入这样的困境:明明掌握了滤波器原理,面对"设计一个中心频率1kHz、带宽200Hz的带通…...
MKVToolNix Batch Tool:高效处理视频字幕的批量解决方案
MKVToolNix Batch Tool:高效处理视频字幕的批量解决方案 【免费下载链接】mkvtoolnix-batch-tool Batch video and subtitle processing program with the ability to add, remove, or extract subtitles from all video files in a directory and its sub-director…...
如何用EmuDeck解决Steam Deck模拟器配置难题:给复古游戏玩家的一站式解决方案
如何用EmuDeck解决Steam Deck模拟器配置难题:给复古游戏玩家的一站式解决方案 【免费下载链接】EmuDeck Emulator configurator for Steam Deck 项目地址: https://gitcode.com/gh_mirrors/em/EmuDeck 在Steam Deck上畅玩经典游戏本应是件轻松愉快的事&#…...
企业微信消息推送API实战:5分钟搞定可信IP与域名配置(含避坑指南)
企业微信消息推送API实战:5分钟搞定可信IP与域名配置(含避坑指南) 当企业微信成为越来越多组织的协同办公中枢,其消息推送API的价值也日益凸显。想象一下:每天早晨9点,销售团队自动收到前日业绩简报&#…...
如何实现重组抗体的精准定制?
一、重组抗体定制与传统抗体制备有何本质区别?重组抗体定制是通过基因工程技术在体外构建并表达目标抗体的创新方法。与传统杂交瘤技术相比,重组抗体技术具有多方面的显著优势。首先,其生产完全不依赖于动物免疫系统,而是通过人工…...
Flutter相机开发避坑指南:CameraPreview全屏适配的正确姿势
Flutter相机开发避坑指南:CameraPreview全屏适配的正确姿势 第一次在Flutter中集成相机功能时,我信心满满地给CameraPreview设置了屏幕宽高,结果看到的画面像被强行拉长的橡皮筋——人脸变成了马脸,圆形变成了椭圆。这种新手必踩的…...
G-Helper开源工具性能优化完全指南:从问题诊断到高级配置
G-Helper开源工具性能优化完全指南:从问题诊断到高级配置 【免费下载链接】g-helper Lightweight, open-source control tool for ASUS laptops and ROG Ally. Manage performance modes, fans, GPU, battery, and RGB lighting across Zephyrus, Flow, TUF, Strix,…...
CentOS 7.6 下 OpenGauss 6.0 极简版安装踩坑实录:从用户权限到远程连接的全流程避坑
CentOS 7.6 下 OpenGauss 6.0 极简版安装实战:从权限配置到远程访问的深度排坑指南 国产数据库的崛起让OpenGauss逐渐成为企业级应用的新选择。但初次部署时,从用户权限到环境变量配置的每个环节都可能成为"拦路虎"。本文将带你穿越安装全流程…...
liunx的编译与链接(7)
1.条件编译的现实用途1.软件根据收费情况进行条件编译来对代码进行动态裁剪2.不同硬件所需的内核代码不同,可以采用条件编译来进行代码裁剪3.开发工具,应用软件的代码采用条件编译来适配不同的操作系统2.要转换为汇编语言的原因是历史导致代码的本质是操…...
3步解锁AI编程助手全部潜力:Cursor Pro功能优化工具深度解析
3步解锁AI编程助手全部潜力:Cursor Pro功能优化工具深度解析 【免费下载链接】cursor-free-vip [Support 0.45](Multi Language 多语言)自动注册 Cursor Ai ,自动重置机器ID , 免费升级使用Pro 功能: Youve reached yo…...
