本发明涉及网页PHP技术领域,特别是一种在线视频转GIF的方法。
背景技术:
GIF(Graphics Interchange Format,可交换的图像文件)相比视频而言,有许多优势存在:体积小,易于传播,支持浏览器多,很多论坛签名和聊天表情包都是GIF做的。因此将视频转成GIF成为时下一个热门。
PHP:Hypertext Preprocessor,超文本预处理器。
技术实现要素:
本发明解决的技术问题在于提供一种在线视频转GIF的方法。
本发明解决上述技术问题的技术方案是:
所述的方法包括如下步骤:
(1)、配置PHP环境,创建三个文件夹frames、gif和video;
其中frames文件夹存放视频的JPG截图,gif文件夹存放JPG转换成的单帧的N张GIF图片,video文件夹存放最原始的视频资源和FFMPEG.exe;
(2)、创建三个PHP文件index.php、convert.php和buildGif.php;其中index.php为入口文件,提供用户交互的上传组件和提交按钮;convert.php为后台处理功能文件;buildGif.php是后台引用的具有GIF合成功能的PHP文件;
(3)、在本地PHP环境下或在线PHP服务器环境下,用户进入index.php程序入口,在中间的文件上传组件中上传视频文件,然后点击转换按钮,等待网页显示出转换的GIF动画。
所述的以convert.php功能点的实现方法是:
(1)、引入buildGif.php并接受来自index.php传来的视频路径参数,用extension_loaded函数加载PHP扩展ffmpeg,利用路径参数实例化ffmpeg;
(2)、定义一个视频长度的参数$length,单位为秒,内容为floor($ffmpegInstance->getDuration()),取舍去小数点后的整数;利用exec函数启动ffmpeg.exe将视频转换格式成flv格式;
(3)、利用一个for循环将flv视频利用ffmpeg.exe按一定的时间间隔批量截图,截取的JPG用时间的MD5加密码在后面加上当前帧的后缀命名;得到视频长度分割整齐的N张JPG图片;
(4)、readdir函数读取存放JPG的文件夹frames,利用FOR循环,定义一个数组为文件夹内容(JPG图片)的集合;同时定义一个延时参数为$ffmpegInstance->getFrameRate()即帧率;
(5)、得到JPG数组后利用函数imagecreatefromjpeg,创建一个$image;然后利用imagegif函数将所有的JPG转换成单帧的GIF格式;此时GIF不是动画,只是JPG转了格式,也是有N张,存在gif文件夹里;
(6)、利用引入的GIF合成功能的PHP文件buildGif.php将所有GIF按时间顺序合成成一张GIF动画,显示在网页上。
所述的buildGif.php功能点的实现方法是:
(1):定义编码格式为“GIF89A”(GIF动画);定义一系列错误信息的显示内容,定义几个参数和数组参数,做一些出错判断,将所有GIF单帧图片组成到一个数组里;
(2):首先添加GIF头部,读取指定的字符串,利用数组的第一帧读取指定参数;
(3):然后按序列逐个添加后续帧,利用一个FOR循环,分布将gif扩展参数,GIF图片参数,GIF颜色参数,GIF单帧图的临时字符组成到一起,连续将N张GIF图片解码组合在一起;
(4):最后将得到的整串字符串重新编码即得到GIF动画。
本发明方案的有益效果如下:
本发明使用方便,PHP环境下上传视频点击按钮即可转换,用户只需要上传待转换的视频文件如MP4等即可等待数秒后得到转换成的GIF动图,由于GIF动画文件小,易于传播,因此具有快速在线转换功能的系统将广泛流行。
本发明效率高,文件只有几个,不含JS,响应速度快。
本发明实用性好,几乎支持所有视频格式,转成的GIF不失真,质量好,
本发明兼容性高:所有主流浏览器都可以适用。
附图说明
下面结合附图对本发明进一步说明:
图1为本发明的流程图。
具体实施方式
下面将结合附图1,对本发明实施例中的技术方案进行清楚、完整的描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出实质性创造获得的方案,都属于本发明保护的范围。
以下为convert.php里功能点的实现顺序和方法:
1:引入buildGif.php并接受来自index.php传来的视频路径参数,用extension_loaded函数加载PHP扩展ffmpeg,利用路径参数实例化ffmpeg;
2:定义一个视频长度的参数$length,单位为秒,内容为floor($ffmpegInstance->getDuration()),取舍去小数点后的整数;利用exec函数启动ffmpeg.exe将视频转换格式成flv格式;
3:利用一个for循环将flv视频利用ffmpeg.exe按一定的时间间隔(本例为1s)批量截图,截取的JPG用时间的MD5加密码在后面加上当前帧的后缀命名;这样便得到视频长度分割整齐的N张JPG图片;
4:readdir函数读取存放JPG的文件夹frames,利用FOR循环,定义一个数组为文件夹内容(JPG图片)的集合;同时定义一个延时参数为$ffmpegInstance->getFrameRate()即帧率。因为本例每秒截取一张图片,所以帧率即图片延时;
5:得到JPG数组后利用函数imagecreatefromjpeg,创建一个$image;然后利用imagegif函数将所有的JPG转换成单帧的GIF格式;此时GIF不是动画,只是JPG转了格式,也是有N张,存在gif文件夹里;
6:利用引入的GIF合成功能的PHP文件buildGif.php将所有GIF按时间顺序合成成一张GIF动画,显示在网页上。
以下为buildGif.php里功能点的实现顺序和方法:
1:定义编码格式为“GIF89A”(GIF动画);定义一系列错误信息的显示内容,定义几个参数和数组参数,做一些出错判断,将所有GIF单帧图片组成到一个数组里;
2:首先添加GIF头部,由于GIF单帧图已经存储成了字符,所有只需要读取指定的字符串,利用数组的第一帧即可读取指定参数;这里充分利用了substr函数和一些转义字符;
3:然后按序列逐个添加后续帧。利用一个FOR循环,分布将gif扩展参数,GIF图片参数,GIF颜色参数,GIF单帧图的临时字符组成到一起,连续将N张GIF图片解码组合在一起;
4:最后将得到的整串字符串重新编码即得到GIF动画。