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 分页原理分析,大家可以看看
Dec 21 PHP
使用php+Ajax实现唯一校验实现代码[简单应用]
Nov 29 PHP
PHP 循环删除无限分类子节点的实现代码
Jun 21 PHP
linux系统下php安装mbstring扩展的二种方法
Jan 20 PHP
PHP计算指定日期所在周的开始和结束日期的方法
Mar 24 PHP
php获取本周星期一具体日期的方法
Apr 20 PHP
利用Fix Rss Feeds插件修复WordPress的Feed显示错误
Dec 19 PHP
linux下php上传文件注意事项
Jun 11 PHP
PHP对象的浅复制与深复制的实例详解
Oct 26 PHP
PHP实现数组转JSon和JSon转数组的方法示例
Jun 14 PHP
PHP实现财务审核通过后返现金额到客户的功能
Jul 04 PHP
php pdo连接数据库操作示例
Nov 18 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
如何跨站抓取别的站点的页面的补充
2006/10/09 PHP
discuz 首页四格:最新话题+最新回复+热门话题+精华文章插件
2007/08/19 PHP
深入eAccelerator与memcached的区别详解
2013/06/06 PHP
php强大的时间转换函数strtotime
2016/02/18 PHP
php-msf源码详解
2017/12/25 PHP
jQuery 中关于CSS操作部分使用说明
2007/06/10 Javascript
js中查找最近的共有祖先元素的实现代码
2010/12/30 Javascript
Jquery实现的一种常用高亮效果示例代码
2014/01/28 Javascript
基于jquery实现发送文章到手机的代码
2014/12/26 Javascript
JavaScript实现Flash炫光波动特效
2015/05/14 Javascript
第一次接触JS require.js模块化工具
2016/04/17 Javascript
jQuery+ajax读取并解析XML文件的方法
2016/09/09 Javascript
javascript函数中的3个高级技巧
2016/09/22 Javascript
angularJS模态框$modal实例代码
2017/05/27 Javascript
在Vue中使用echarts的实例代码(3种图)
2017/07/10 Javascript
手把手教你vue-cli单页到多页应用的方法
2018/05/31 Javascript
layui checkbox默认选中,获取选中值,清空所有选中项的例子
2019/09/02 Javascript
[51:30]OG vs LGD 2018国际邀请赛淘汰赛BO3 第二场 8.26
2018/08/30 DOTA
Python中集合类型(set)学习小结
2015/01/28 Python
python 删除大文件中的某一行(最有效率的方法)
2017/08/19 Python
Tensorflow 自带可视化Tensorboard使用方法(附项目代码)
2018/02/10 Python
Python3爬虫教程之利用Python实现发送天气预报邮件
2018/12/16 Python
Django使用模板后无法找到静态资源文件问题解决
2019/07/19 Python
Python文件读写w+和r+区别解析
2020/03/26 Python
快速解决Django关闭Debug模式无法加载media图片与static静态文件
2020/04/07 Python
Python如何将将模块分割成多个文件
2020/08/04 Python
Python 解析xml文件的示例
2020/09/29 Python
解决pip安装的第三方包在PyCharm无法导入的问题
2020/10/15 Python
CSS3打造磨砂玻璃背景效果
2016/09/28 HTML / CSS
利用三角函数在canvas上画虚线的方法
2018/01/11 HTML / CSS
网站性能延迟加载图像的五种技巧(小结)
2020/08/13 HTML / CSS
国外的一些J2EE面试题一
2012/10/13 面试题
教师通用专业自荐书范文
2014/02/11 职场文书
2015年采购工作总结
2015/04/10 职场文书
《多彩的民间艺术》教学反思
2016/02/16 职场文书
Python获取指定日期是"星期几"的6种方法
2022/03/13 Python