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中执行系统外部命令
Oct 09 PHP
php $_SERVER windows系统与linux系统下的区别说明
Feb 14 PHP
php中namespace use用法实例分析
Jan 22 PHP
关于PHP中Session文件过多的问题及session文件保存位置
Mar 17 PHP
php版微信自动获取收货地址api用法示例
Sep 22 PHP
PHP模拟http请求的方法详解
Nov 09 PHP
php-msf源码详解
Dec 25 PHP
PHP中define() 与 const定义常量的区别详解
Jun 25 PHP
Yii Framework框架使用PHPExcel组件的方法示例
Jul 24 PHP
php快速导入大量数据的实例方法
Sep 23 PHP
laravel-admin解决表单select联动时,编辑默认没选上的问题
Sep 30 PHP
PHP的new static和new self的区别与使用
Nov 27 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
PHP 简单数组排序实现代码
2009/08/05 PHP
php实现的仿阿里巴巴实现同类产品翻页
2009/12/11 PHP
Google Voice 短信发送接口PHP开源版(2010.5更新)
2010/07/22 PHP
PHP如何通过传引用的思想实现无限分类(代码简单)
2015/10/13 PHP
服务器迁移php版本不同可能诱发的问题
2015/12/22 PHP
PHP迭代器和迭代的实现与使用方法分析
2018/04/19 PHP
PHP设计模式之模板方法模式实例浅析
2018/12/20 PHP
tp5.0框架隐藏index.php入口文件及模块和控制器的方法分析
2020/02/11 PHP
TP5框架model常见操作示例小结【增删改查、聚合、时间戳、软删除等】
2020/04/05 PHP
非常漂亮的JS代码经典广告
2007/10/21 Javascript
判断控件是否已加载完成的代码
2010/02/24 Javascript
让元素在网页中可拖动示例代码
2013/08/13 Javascript
js在输入框屏蔽按键,只能键入数字的示例代码
2014/01/03 Javascript
当达到输入长度时表单自动切换焦点
2014/04/06 Javascript
jQuery的几个我们必须了解的特点
2015/05/03 Javascript
JavaScript实现添加及删除事件的方法小结
2015/08/04 Javascript
JavaScript数组去重由慢到快由繁到简(优化篇)
2016/08/26 Javascript
vue中各选项及钩子函数执行顺序详解
2018/08/25 Javascript
JS跨浏览器解析XML应用过程详解
2020/10/16 Javascript
Vue实现多页签组件
2021/01/14 Vue.js
Python解决鸡兔同笼问题的方法
2014/12/20 Python
在Linux上安装Python的Flask框架和创建第一个app实例的教程
2015/03/30 Python
Python使用py2neo操作图数据库neo4j的方法详解
2020/01/13 Python
python shapely.geometry.polygon任意两个四边形的IOU计算实例
2020/04/12 Python
python 检测图片是否有马赛克
2020/12/01 Python
前端面试必备之html5的新特性
2017/09/05 HTML / CSS
STP协议的主要用途是什么?为什么要用STP
2012/12/20 面试题
大专应届生个人的自我评价
2013/11/21 职场文书
开业庆典主持词
2014/03/21 职场文书
毕业生就业意向书
2014/04/01 职场文书
党的群众路线教育实践活动总结大会主持词
2014/10/30 职场文书
辛德勒的名单观后感
2015/06/03 职场文书
催款函范文
2015/06/24 职场文书
创业的9条正确思考方式
2019/08/26 职场文书
分布式锁为什么要选择Zookeeper而不是Redis?看完这篇你就明白了
2021/05/21 Redis
mysql的单列多值存储实例详解
2022/04/05 MySQL