php截取视频指定帧为图片


Posted in PHP onMay 16, 2016

截取视频指定帧为图片,php ffmpeg扩展已经完美实现:

$movie = new ffmpeg_movie($video_filePath);
$ff_frame = $movie->getFrame(1);
$gd_image = $ff_frame->toGDImage();
$img="./test.jpg";
imagejpeg($gd_image, $img);
imagedestroy($gd_image);

然而问题来了,智能手机拍摄的视频,由于拍摄方向不同,视频会被旋转,并带上meta信息rotate,当你相对视频截取frame图片的时候,如果有rotate信息的视频,frame也是旋转的,因此你需要将截取的图片相应的旋转。

然后php ffmpeg扩展并无法获知rotation信息(php ffmpeg扩展文档),但可以通过ffmpeg命令行获取:

/usr/local/ffmpeg/bin/ffprobe test.mp4 -show_streams  | grep rotate
用php简单封装下如下:

function get_video_orientation($video_path) {
  $cmd = "/usr/local/ffmpeg/bin/ffprobe " . $video_path . " -show_streams 2>/dev/null";
  $result = shell_exec($cmd);
 
  $orientation = 0;
  if(strpos($result, 'TAG:rotate') !== FALSE) {
    $result = explode("\n", $result);
    foreach($result as $line) {
      if(strpos($line, 'TAG:rotate') !== FALSE) {
        $stream_info = explode("=", $line);
        $orientation = $stream_info[1];
      }
    }
  }
  return $orientation;
}

使用imagerotate()函数就可以旋转截图:

$movie = new ffmpeg_movie($video_filePath);
$frame = $movie->getFrame(1);
$gd = $frame->toGDImage();
if ($orientation = $this->get_video_orientation($video_filePath)) {
  $gd = imagerotate($gd, 360-$orientation, 0);
}
$img="./test.jpg";
imagejpeg($gd, $img);
imagedestroy($gd_image);

最后还有一个麻烦事,不是所有的播放器和浏览器都可对video识别orientation并自动rotate,如果你想对视频进行旋转,可通过ffmpeg命令解决:

/usr/local/ffmpeg/bin/ffmpeg -i input.mp4 -vf 'transpose=3' -metadata:s:v:0 rotate=0

以上就是本文的全部内容,希望对大家学习php程序设计有所帮助。

PHP 相关文章推荐
PHP数据流应用的一个简单实例
Sep 14 PHP
PHP合并两个数组的两种方式的异同
Sep 14 PHP
php获取服务器信息的实现代码
Feb 04 PHP
LotusPhp笔记之:基于ObjectUtil组件的使用分析
May 06 PHP
PHP按行读取文件时删除换行符的3种方法
May 04 PHP
php使用递归计算文件夹大小
Dec 24 PHP
PHP+MySQL实现无极限分类栏目的方法
Dec 23 PHP
php cookie工作原理与实例详解
Jul 18 PHP
PHP实现的同步推荐操作API接口案例分析
Nov 30 PHP
PDO实现学生管理系统
Mar 21 PHP
php输出形式实例整理
May 05 PHP
PHP文件打开关闭及读写操作示例解析
Aug 06 PHP
PHP中常用的数组操作方法笔记整理
May 16 #PHP
PHP获取用户访问IP地址的5种方法
May 16 #PHP
php pdo oracle中文乱码的快速解决方法
May 16 #PHP
Yii2中OAuth扩展及QQ互联登录实现方法
May 16 #PHP
Yii2 assets清除缓存的方法
May 16 #PHP
php使用curl通过代理获取数据的实现方法
May 16 #PHP
php实现转换html格式为文本格式的方法
May 16 #PHP
You might like
受疫情影响 动画《Re从零开始的异世界生活》第二季延期至7月
2020/03/10 日漫
一个从别的网站抓取信息的例子(域名查询)
2006/10/09 PHP
PHP代码保护--Zend Guard的使用详解
2013/06/03 PHP
phpmailer在服务器上不能正常发送邮件的解决办法
2014/07/08 PHP
php将HTML表格每行每列转为数组实现采集表格数据的方法
2015/04/03 PHP
详解PHP执行定时任务的实现思路
2015/12/21 PHP
CI框架文件上传类及图像处理类用法分析
2016/05/18 PHP
Thinkphp5结合layer弹窗定制操作结果页面
2017/07/07 PHP
原生PHP实现导出csv格式Excel文件的方法示例【附源码下载】
2019/03/07 PHP
无阻塞加载脚本分析[全]
2011/01/20 Javascript
js判断undefined类型,undefined,null, 的区别详细解析
2013/12/16 Javascript
js实现的类似于asp数据字典的数据类型代码实例
2014/09/03 Javascript
提升PHP安全:8个必须修改的PHP默认配置
2014/11/17 Javascript
使用jquery实现鼠标滑过弹出更多相关信息层附源码下载
2015/11/23 Javascript
Vue实现6位数密码效果
2018/08/18 Javascript
详谈js的变量提升以及使用方法
2018/10/06 Javascript
Angular之jwt令牌身份验证的实现
2020/02/14 Javascript
[01:00]选手抵达华西村 整装待发备战2016国际邀请赛中国区预选赛
2016/06/25 DOTA
[47:45]DOTA2-DPC中国联赛 正赛 Phoenix vs Dragon BO3 第一场 2月26日
2021/03/11 DOTA
解读Django框架中的低层次缓存API
2015/07/24 Python
使用Python控制摄像头拍照并发邮件
2019/04/23 Python
python实现比较类的两个instance(对象)是否相等的方法分析
2019/06/26 Python
pytorch torch.expand和torch.repeat的区别详解
2019/11/05 Python
TensorBoard 计算图的可视化实现
2020/02/15 Python
PyQt5+Pycharm安装和配置图文教程详解
2020/03/24 Python
HTML5实现可缩放时钟代码
2017/08/28 HTML / CSS
英国第一家领先的在线处方眼镜零售商:Glasses Direct
2018/02/23 全球购物
.NET是怎么支持多种语言的
2015/02/24 面试题
银行职员个人的工作自我评价
2014/02/15 职场文书
美容院经理岗位职责
2014/04/03 职场文书
供应链金融服务方案
2014/05/25 职场文书
行政专员岗位职责说明书
2014/07/30 职场文书
教务处教学工作总结
2015/08/10 职场文书
小型企业的绩效考核制度模板
2019/11/21 职场文书
MySQL系列之四 SQL语法
2021/07/02 MySQL
Java基础——Map集合
2022/04/01 Java/Android