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程序设计有所帮助。