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 相关文章推荐
require(),include(),require_once()和include_once()的异同
Jan 02 PHP
PHP curl_setopt()函数实例代码与参数分析
Jun 02 PHP
php eval函数用法 PHP中eval()函数小技巧
Oct 31 PHP
php发送get、post请求的6种方法简明总结
Jul 08 PHP
重新认识php array_merge函数
Aug 31 PHP
PHP CodeIgniter框架的工作原理研究
Mar 30 PHP
Linux下编译redis和phpredis的方法
Apr 07 PHP
PHP 实现从数据库导出到.csv文件方法
Jul 06 PHP
Laravel实现定时任务的示例代码
Aug 10 PHP
PHP实现微信申请退款功能
Oct 01 PHP
php+mysql开发中的经验与常识小结
Mar 25 PHP
laravel5 Eloquent 实现事务方式
Oct 21 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开发中四种查询返回结果分析
2011/01/02 PHP
Laravel学习教程之request validation的编写
2017/10/25 PHP
PHP实现转盘抽奖算法分享
2020/04/15 PHP
Laravel 不同生产环境服务器的判断实践
2019/10/15 PHP
解决thinkPHP 5 nginx 部署时,只跳转首页的问题
2019/10/16 PHP
laravel5.6中的外键约束示例
2019/10/23 PHP
php7 图形用户界面GUI 开发示例
2020/02/22 PHP
yii框架结合charjs实现统计30天数据的方法
2020/04/04 PHP
js中巧用cssText属性批量操作样式
2011/03/13 Javascript
JQuery之拖拽插件实现代码
2011/04/14 Javascript
javascript date格式化示例
2013/09/25 Javascript
jQuery学习笔记之总体架构
2014/06/03 Javascript
node.js中的favicon.ico请求问题处理
2014/12/15 Javascript
js window对象属性和方法相关资料整理
2015/11/11 Javascript
JavaScript中rem布局在react中的应用
2015/12/09 Javascript
js学习笔记之事件处理模型
2016/10/31 Javascript
javascript中setAttribute兼容性用法分析
2016/12/12 Javascript
微信小程序 标签传入数据
2017/05/08 Javascript
详解Angular.js中$http拦截器的介绍及使用
2017/07/04 Javascript
Vue.js与 ASP.NET Core 服务端渲染功能整合
2017/11/16 Javascript
jQuery简单实现的HTML页面文本框模糊匹配查询功能完整示例
2018/05/09 jQuery
区别JavaScript函数声明与变量声明
2018/09/12 Javascript
[46:12]完美世界DOTA2联赛循环赛 DM vs Matador BO2第一场 11.04
2020/11/04 DOTA
Python实现判断一个整数是否为回文数算法示例
2019/03/02 Python
Django框架组成结构、基本概念与文件功能分析
2019/07/30 Python
python定义类self用法实例解析
2020/01/22 Python
Python如何用filter函数筛选数据
2020/03/05 Python
Selenium常见异常解析及解决方案示范
2020/04/10 Python
Python如何输出百分比
2020/07/31 Python
Python xlwings插入Excel图片的实现方法
2021/02/26 Python
html5 拖拽上传图片实例演示
2013/04/01 HTML / CSS
欧洲最大的婴幼儿服装及内衣公司:Petit Bateau(小帆船)
2016/08/16 全球购物
运动鞋、足球鞋和慕尼黑球衣:Sport Münzinger
2019/08/26 全球购物
工程力学硕士生的自我评价范文
2013/11/16 职场文书
党的群众路线教育实践活动心得体会900字
2014/03/07 职场文书
Vue.js中v-bind指令的用法介绍
2022/03/13 Vue.js