监控视频片段合并完整视频|FFmpeg将多个视频片段拼接完整视频|PHP自动批量拼接合并视频

这篇具有很好参考价值的文章主要介绍了监控视频片段合并完整视频|FFmpeg将多个视频片段拼接完整视频|PHP自动批量拼接合并视频。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

关于环境配置ffmpeg安装使用的看之前文章 哔哩哔哩缓存转码|FFmpeg将m4s文件转为mp4|PHP自动批量转码B站视频文章来源地址https://www.toymoban.com/news/detail-764669.html

<?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自动批量拼接合并视频的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • mysql 一对多 合并多个通过 逗号拼接展示

    mysql 一对多 合并多个通过 逗号拼接展示 以上内容由chatgpt中文网 动态生成 laravel model 对应写法

    2024年01月16日
    浏览(28)
  • 基于Python实现的一款轻量、强大、好用的视频处理软件,可缩视频、转码视频、倒放视频、合并片段、根据字幕裁切片段、自动配字幕等

    Quick Cut 是一款轻量、强大、好用的视频处理软件。它是一个轻量的工具,而不是像 Davinci Resolve、Adobe Premiere 那样专业的、复杂的庞然大物。Quick Cut 可以满足普通人一般的视频处理需求:压缩视频、转码视频、倒放视频、合并片段、根据字幕裁切片段、自动配字幕、自动剪辑

    2024年01月24日
    浏览(32)
  • ffmpeg拼接视频

    我没有直接安装ffmpeg,因为好多软件里都已经自带了 想拼接视频的话,找两个视频文件,随便放在一个目录 videolist.txt中写入待拼接的视频文件相对路径 然后就可以拼接了 joinooutput.mp4是输出名 ok了 当然,还有其他不少的拼接方法,这只是其中的一种。 2、两段视频同时播放

    2024年01月17日
    浏览(26)
  • FFmpeg工具进行快速的视频拼接

    用FFmpeg工具对视频进行处理,FFmpeg有非常强大的功能包括视频采集功能、视频格式转换、视频抓图、给视频加水印等。 下载FFmpeg视频工具。 直接搜索下载,根据电脑选择不同的资源。 下载完解压,可以解压到任何盘,可以改一下文件夹名称。 这种先要设置环境变量 先找到

    2024年02月02日
    浏览(26)
  • 【FFMPEG应用篇】使用FFmpeg的常见问题 拼接视频的问题

    在使用ffmpeg进行视频拼接时,可能会遇到一些常见问题。以下是这些问题及其解决方法: 1. 视频格式不兼容:如果要拼接的视频格式不同,ffmpeg可能会报错。解决方法是使用ffmpeg进行格式转换,将所有视频转换为相同的格式,然后再进行拼接。 2. 视频编解码器不匹配:如果

    2024年02月13日
    浏览(24)
  • Java原来可以这么玩!CV视频合成处理,视频前后拼接,画面合并

    本章内容教会你如何用java代码实现 两个视频的画面合并 或者前后拼接。原理是使用了javacv开源jar包,代码经过反复修改,已经实现我能想到的最优最快的实现,如果你有更好更快的实现,欢迎评论区留言!!! 先展示一下效果吧!!! 两个视频前后拼接 两个视频画面合并

    2024年01月21日
    浏览(32)
  • 怎么合并多个视频?简单视频合并方法分享

    合并多个视频可以将它们组合成一个更长的视频,这对于需要播放多个短视频的情况非常有用。此外,合并视频还可以使视频编辑过程更加高效,因为不必将多个独立的视频文件分别处理。最后,合并视频可以减少文件数量,从而使整个视频集合更加整洁和易于管理。下面给

    2024年02月14日
    浏览(32)
  • Python常用视频编辑操作——读取与保存视频、更改帧数、拼接视频、视频语音合并、视频与图像互转等

    降低视频帧数,简单的操作只能降低视频帧数,如果要增加视频帧数,那就要使用深度学习进行插帧处理: 水平合并的效果:

    2024年02月02日
    浏览(31)
  • 哔哩哔哩视频合并 B站缓存视频合并 安卓版 音视频合并 基于ffmpeg

    此软件是为了帮助网友合并哔哩哔哩缓存视频,Android上将bilibili缓存视频合并导出为mp4,你可以将它理解为一个专用的格式工厂,并不涉及破解相关内容,仅仅用于学习技术交流,严禁用于商业用途,如有侵权请联系我删档,对你带来困惑和不便我深感抱歉。 合并(导出)B站缓

    2024年02月02日
    浏览(52)
  • ffmpeg@音视频工具@音视频合并

    FFmpeg中文网 (github.net.cn) FFmpeg 是一款强大的开源跨平台音视频处理工具集,它包含了一系列命令行工具以及用于音频和视频编码解码、格式转换、抓取、流化等功能的库。FFmpeg 支持多种视频、音频格式和编解码器,能够进行音视频的压缩、封装、转码、分割、合并、过滤、抓

    2024年03月17日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包