php截取视频指定帧为图片
截取视频指定帧为图片,phpffmpeg扩展已经完美实现:
$movie=newffmpeg_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也是旋转的,因此你需要将截取的图片相应的旋转。
然后phpffmpeg扩展并无法获知rotation信息(phpffmpeg扩展文档),但可以通过ffmpeg命令行获取:
/usr/local/ffmpeg/bin/ffprobetest.mp4-show_streams |greprotate
用php简单封装下如下:
functionget_video_orientation($video_path){ $cmd="/usr/local/ffmpeg/bin/ffprobe".$video_path."-show_streams2>/dev/null"; $result=shell_exec($cmd); $orientation=0; if(strpos($result,'TAG:rotate')!==FALSE){ $result=explode("\n",$result); foreach($resultas$line){ if(strpos($line,'TAG:rotate')!==FALSE){ $stream_info=explode("=",$line); $orientation=$stream_info[1]; } } } return$orientation; }
使用imagerotate()函数就可以旋转截图:
$movie=newffmpeg_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-iinput.mp4-vf'transpose=3'-metadata:s:v:0rotate=0
以上就是本文的全部内容,希望对大家学习php程序设计有所帮助。