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 相关文章推荐
使用Xdebug调试和优化PHP程序之[1]
Apr 17 PHP
php pcntl_fork和pcntl_fork 的用法
Apr 13 PHP
php ob_flush,flush在ie中缓冲无效的解决方法
May 09 PHP
解析php DOMElement 操作xml 文档的实现代码
May 10 PHP
php跨服务器访问方法小结
May 12 PHP
php使用pclzip类实现文件压缩的方法(附pclzip类下载地址)
Apr 30 PHP
Yii2.0中的COOKIE和SESSION用法
Aug 12 PHP
PHP面向对象程序设计之命名空间与自动加载类详解
Dec 02 PHP
php获取网站根目录物理路径的几种方法(推荐)
Mar 04 PHP
php接口隔离原则实例分析
Nov 11 PHP
PHP的图像处理实例小结【文字水印、图片水印、压缩图像等】
Dec 20 PHP
PHP单元测试配置与使用方法详解
Dec 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 文件缓存的性能测试
2010/04/25 PHP
php数组函数序列之next() - 移动数组内部指针到下一个元素的位置,并返回该元素值
2011/10/31 PHP
php实现cc攻击防御和防止快速刷新页面示例
2014/02/13 PHP
php-fpm添加service服务的例子
2018/04/27 PHP
JavaScript函数、方法、对象代码
2008/10/29 Javascript
ExtJS 2.0 GridPanel基本表格简明教程
2010/05/25 Javascript
cnblogs中在闪存中屏蔽某人的实现代码
2010/11/14 Javascript
jQuery EasyUI API 中文文档 - ComboGrid 组合表格
2011/10/13 Javascript
深入理解JavaScript系列(14) 作用域链介绍(Scope Chain)
2012/04/12 Javascript
JavaScript实现动态删除列表框值的方法
2015/08/12 Javascript
JS简单获取客户端IP地址的方法【调用搜狐接口】
2016/09/05 Javascript
Vue 固定头 固定列 点击表头可排序的表格组件
2016/11/25 Javascript
js基于myFocus实现轮播图效果
2017/02/14 Javascript
Easyui在treegrid添加控件的实现方法
2017/06/23 Javascript
Vue.js 动态为img的src赋值方法
2018/03/14 Javascript
JS开发 富文本编辑器TinyMCE详解
2019/07/19 Javascript
javascript设计模式 ? 代理模式原理与用法实例分析
2020/04/16 Javascript
详解js中的原型,原型对象,原型链
2020/07/16 Javascript
JS数组转字符串实现方法解析
2020/09/04 Javascript
仅用50行Python代码实现一个简单的代理服务器
2015/04/08 Python
Python实现队列的方法
2015/05/26 Python
Python批处理删除和重命名文件夹的实例
2018/07/11 Python
Python基础学习之函数方法实例详解
2019/06/18 Python
pycharm运行scrapy过程图解
2019/11/22 Python
Pytorch 数据加载与数据预处理方式
2019/12/31 Python
通过 Python 和 OpenCV 实现目标数量监控
2020/01/05 Python
Python对象的属性访问过程详解
2020/03/05 Python
美国汽配连锁巨头Pep Boys官网:轮胎更换、汽车维修服务和汽车零部件
2017/01/14 全球购物
纽约复古灵感的现代珠宝品牌:Lulu Frost
2018/03/03 全球购物
好的自荐信包括什么内容
2013/11/07 职场文书
军训考核自我鉴定
2014/02/13 职场文书
党的群众路线教育实践活动学习计划
2014/11/03 职场文书
机关单位保密工作责任书
2015/05/11 职场文书
2016学校元旦晚会经典开场白台词
2015/12/03 职场文书
学校运动会开幕词
2016/03/03 职场文书
MongoDB balancer的使用详解
2021/04/30 MongoDB