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 相关文章推荐
第十三节--对象串行化
Nov 16 PHP
php-accelerator网站加速PHP缓冲的方法
Jul 30 PHP
php 引用(&)详解
Nov 20 PHP
php addslashes和mysql_real_escape_string
Jan 24 PHP
PHP中基于ts与nts版本- vc6和vc9编译版本的区别详解
Apr 26 PHP
解析php利用正则表达式解决采集内容排版的问题
Jun 20 PHP
PHP使用feof()函数读文件的方法
Nov 07 PHP
PHP中使用php5-ffmpeg撷取视频图片实例
Jan 07 PHP
PHP实现简单实用的分页类代码
Apr 08 PHP
PHP实现动态创建XML文档的方法
Mar 30 PHP
php curl批处理实现可控并发异步操作示例
May 09 PHP
PHP高并发和大流量解决方案整理
Dec 24 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
CentOS 6.2使用yum安装LAMP以及phpMyadmin详解
2013/06/17 PHP
php向js函数传参的几种方法
2014/08/10 PHP
老生常谈PHP 文件写入和读取(必看篇)
2017/05/22 PHP
jquery 上下滚动广告
2009/06/17 Javascript
style、 currentStyle、 runtimeStyle区别分析
2010/08/01 Javascript
Jquery中获取iframe的代码
2011/01/11 Javascript
javascript 学习笔记(六)浏览器类型及版本信息检测代码
2011/04/08 Javascript
JavaScript常用对象的方法和属性小结
2012/01/24 Javascript
使用简洁的jQuery方法实现隔行换色功能
2014/01/02 Javascript
JavaScript字符串对象substr方法入门实例(用于截取字符串)
2014/10/16 Javascript
javascript工厂方式定义对象
2014/12/26 Javascript
JS 对象属性相关(检查属性、枚举属性等)
2015/04/05 Javascript
javascript将DOM节点添加到文档的方法实例分析
2015/08/04 Javascript
关于Vue Webpack2单元测试示例详解
2017/08/14 Javascript
vue移动端路由切换实例分析
2018/05/14 Javascript
Vue实现类似Spring官网图片滑动效果方法
2019/03/01 Javascript
解决vue组件销毁之后计时器继续执行的问题
2020/07/21 Javascript
基于postman获取动态数据过程详解
2020/09/08 Javascript
[46:00]DOTA2上海特级锦标赛主赛事日 - 2 胜者组第一轮#4EG VS Fnatic第一局
2016/03/03 DOTA
python正则分组的应用
2013/11/10 Python
python list转dict示例分享
2014/01/28 Python
Python NumPy库安装使用笔记
2015/05/18 Python
python脚本爬取字体文件的实现方法
2017/04/29 Python
Pycharm 文件更改目录后,执行路径未更新的解决方法
2019/07/19 Python
python中web框架的自定义创建
2019/09/08 Python
python实现图片上添加图片
2019/11/26 Python
Python中无限循环需要什么条件
2020/05/27 Python
PyCharm MySQL可视化Database配置过程图解
2020/06/09 Python
PyTorch: Softmax多分类实战操作
2020/07/07 Python
canvas小画板之平滑曲线的实现
2020/08/12 HTML / CSS
基督教卡片、励志礼品、家居装饰等:DaySpring
2018/10/12 全球购物
.NET是怎么支持多种语言的
2015/02/24 面试题
你们项目是如何进行变更控制的
2015/08/26 面试题
交通事故一次性赔偿协议书范本
2014/11/02 职场文书
2015年学校安全管理工作总结
2015/05/11 职场文书
幼儿园老师新年寄语
2015/08/17 职场文书