使用 FFmpeg 截取视频中多个图片,然后拼成一张图

最近在做一个视频处理模块,需要在视频中截取几张图,然后拼成一张大图;

注意: 服务器需要安装ffmpeg,请参考官方文档

<?php
   //获取文件路径
   fwrite(STDOUT, "哪个视频文件:");
   $video_path = trim(fgets(STDIN));

   fwrite(STDOUT, "多少秒截取1张图:");
   $s = trim(fgets(STDIN));

   //设置输出路径
   fwrite(STDOUT, "输出到哪里:");
   $export_path = trim(fgets(STDIN));

   $command = system('ffmpeg -y -i '.$video_path.' -vf "fps=1/'.$s.',scale=iw/4:-1,tile=2x2" -an '.$export_path.'_%d.png'); 

   // fps = 1/2 每2秒截一张图,如果是每秒截一张 参数就是 fps=1
   // scale 截图大小,上面的代码是设置宽为原始的1/4大小,高度自动,也可以设置成固定值如:120:80
   // tile 网格化,自动将100张图合并成一张大图
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 1

补充一个知识点:
上一个方法,截图会输出很多张大图,这不是我想要的, 我只想从视频中提取4张图片,然后拼接成一张大图怎么操作;
获得视频总时长然后除以4就好了(如果要6张图就除以6)
代码如下:
$duration = system('ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 -i '.$video_path.'');
$s = $duration/4;
$command = system('ffmpeg -y -i '.$videopath.' -vf "fps=1/'.$s.',scale=iw/4:-1,tile=2x2" -an 1%d.png');

4年前 评论
lovecn 4年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!