本發(fā)明涉及網(wǎng)頁(yè)P(yáng)HP技術(shù)領(lǐng)域,特別是一種在線視頻轉(zhuǎn)GIF的方法。
背景技術(shù):
GIF(Graphics Interchange Format,可交換的圖像文件)相比視頻而言,有許多優(yōu)勢(shì)存在:體積小,易于傳播,支持瀏覽器多,很多論壇簽名和聊天表情包都是GIF做的。因此將視頻轉(zhuǎn)成GIF成為時(shí)下一個(gè)熱門。
PHP:Hypertext Preprocessor,超文本預(yù)處理器。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明解決的技術(shù)問題在于提供一種在線視頻轉(zhuǎn)GIF的方法。
本發(fā)明解決上述技術(shù)問題的技術(shù)方案是:
所述的方法包括如下步驟:
(1)、配置PHP環(huán)境,創(chuàng)建三個(gè)文件夾frames、gif和video;
其中frames文件夾存放視頻的JPG截圖,gif文件夾存放JPG轉(zhuǎn)換成的單幀的N張GIF圖片,video文件夾存放最原始的視頻資源和FFMPEG.exe;
(2)、創(chuàng)建三個(gè)PHP文件index.php、convert.php和buildGif.php;其中index.php為入口文件,提供用戶交互的上傳組件和提交按鈕;convert.php為后臺(tái)處理功能文件;buildGif.php是后臺(tái)引用的具有GIF合成功能的PHP文件;
(3)、在本地PHP環(huán)境下或在線PHP服務(wù)器環(huán)境下,用戶進(jìn)入index.php程序入口,在中間的文件上傳組件中上傳視頻文件,然后點(diǎn)擊轉(zhuǎn)換按鈕,等待網(wǎng)頁(yè)顯示出轉(zhuǎn)換的GIF動(dòng)畫。
所述的以convert.php功能點(diǎn)的實(shí)現(xiàn)方法是:
(1)、引入buildGif.php并接受來(lái)自index.php傳來(lái)的視頻路徑參數(shù),用extension_loaded函數(shù)加載PHP擴(kuò)展ffmpeg,利用路徑參數(shù)實(shí)例化ffmpeg;
(2)、定義一個(gè)視頻長(zhǎng)度的參數(shù)$length,單位為秒,內(nèi)容為floor($ffmpegInstance->getDuration()),取舍去小數(shù)點(diǎn)后的整數(shù);利用exec函數(shù)啟動(dòng)ffmpeg.exe將視頻轉(zhuǎn)換格式成flv格式;
(3)、利用一個(gè)for循環(huán)將flv視頻利用ffmpeg.exe按一定的時(shí)間間隔批量截圖,截取的JPG用時(shí)間的MD5加密碼在后面加上當(dāng)前幀的后綴命名;得到視頻長(zhǎng)度分割整齊的N張JPG圖片;
(4)、readdir函數(shù)讀取存放JPG的文件夾frames,利用FOR循環(huán),定義一個(gè)數(shù)組為文件夾內(nèi)容(JPG圖片)的集合;同時(shí)定義一個(gè)延時(shí)參數(shù)為$ffmpegInstance->getFrameRate()即幀率;
(5)、得到JPG數(shù)組后利用函數(shù)imagecreatefromjpeg,創(chuàng)建一個(gè)$image;然后利用imagegif函數(shù)將所有的JPG轉(zhuǎn)換成單幀的GIF格式;此時(shí)GIF不是動(dòng)畫,只是JPG轉(zhuǎn)了格式,也是有N張,存在gif文件夾里;
(6)、利用引入的GIF合成功能的PHP文件buildGif.php將所有GIF按時(shí)間順序合成成一張GIF動(dòng)畫,顯示在網(wǎng)頁(yè)上。
所述的buildGif.php功能點(diǎn)的實(shí)現(xiàn)方法是:
(1):定義編碼格式為“GIF89A”(GIF動(dòng)畫);定義一系列錯(cuò)誤信息的顯示內(nèi)容,定義幾個(gè)參數(shù)和數(shù)組參數(shù),做一些出錯(cuò)判斷,將所有GIF單幀圖片組成到一個(gè)數(shù)組里;
(2):首先添加GIF頭部,讀取指定的字符串,利用數(shù)組的第一幀讀取指定參數(shù);
(3):然后按序列逐個(gè)添加后續(xù)幀,利用一個(gè)FOR循環(huán),分布將gif擴(kuò)展參數(shù),GIF圖片參數(shù),GIF顏色參數(shù),GIF單幀圖的臨時(shí)字符組成到一起,連續(xù)將N張GIF圖片解碼組合在一起;
(4):最后將得到的整串字符串重新編碼即得到GIF動(dòng)畫。
本發(fā)明方案的有益效果如下:
本發(fā)明使用方便,PHP環(huán)境下上傳視頻點(diǎn)擊按鈕即可轉(zhuǎn)換,用戶只需要上傳待轉(zhuǎn)換的視頻文件如MP4等即可等待數(shù)秒后得到轉(zhuǎn)換成的GIF動(dòng)圖,由于GIF動(dòng)畫文件小,易于傳播,因此具有快速在線轉(zhuǎn)換功能的系統(tǒng)將廣泛流行。
本發(fā)明效率高,文件只有幾個(gè),不含JS,響應(yīng)速度快。
本發(fā)明實(shí)用性好,幾乎支持所有視頻格式,轉(zhuǎn)成的GIF不失真,質(zhì)量好,
本發(fā)明兼容性高:所有主流瀏覽器都可以適用。
附圖說(shuō)明
下面結(jié)合附圖對(duì)本發(fā)明進(jìn)一步說(shuō)明:
圖1為本發(fā)明的流程圖。
具體實(shí)施方式
下面將結(jié)合附圖1,對(duì)本發(fā)明實(shí)施例中的技術(shù)方案進(jìn)行清楚、完整的描述,顯然,所描述的實(shí)施例僅僅是本發(fā)明一部分實(shí)施例,而不是全部的實(shí)施例?;诒景l(fā)明中的實(shí)施例,本領(lǐng)域普通技術(shù)人員在沒有做出實(shí)質(zhì)性創(chuàng)造獲得的方案,都屬于本發(fā)明保護(hù)的范圍。
以下為convert.php里功能點(diǎn)的實(shí)現(xiàn)順序和方法:
1:引入buildGif.php并接受來(lái)自index.php傳來(lái)的視頻路徑參數(shù),用extension_loaded函數(shù)加載PHP擴(kuò)展ffmpeg,利用路徑參數(shù)實(shí)例化ffmpeg;
2:定義一個(gè)視頻長(zhǎng)度的參數(shù)$length,單位為秒,內(nèi)容為floor($ffmpegInstance->getDuration()),取舍去小數(shù)點(diǎn)后的整數(shù);利用exec函數(shù)啟動(dòng)ffmpeg.exe將視頻轉(zhuǎn)換格式成flv格式;
3:利用一個(gè)for循環(huán)將flv視頻利用ffmpeg.exe按一定的時(shí)間間隔(本例為1s)批量截圖,截取的JPG用時(shí)間的MD5加密碼在后面加上當(dāng)前幀的后綴命名;這樣便得到視頻長(zhǎng)度分割整齊的N張JPG圖片;
4:readdir函數(shù)讀取存放JPG的文件夾frames,利用FOR循環(huán),定義一個(gè)數(shù)組為文件夾內(nèi)容(JPG圖片)的集合;同時(shí)定義一個(gè)延時(shí)參數(shù)為$ffmpegInstance->getFrameRate()即幀率。因?yàn)楸纠棵虢厝∫粡垐D片,所以幀率即圖片延時(shí);
5:得到JPG數(shù)組后利用函數(shù)imagecreatefromjpeg,創(chuàng)建一個(gè)$image;然后利用imagegif函數(shù)將所有的JPG轉(zhuǎn)換成單幀的GIF格式;此時(shí)GIF不是動(dòng)畫,只是JPG轉(zhuǎn)了格式,也是有N張,存在gif文件夾里;
6:利用引入的GIF合成功能的PHP文件buildGif.php將所有GIF按時(shí)間順序合成成一張GIF動(dòng)畫,顯示在網(wǎng)頁(yè)上。
以下為buildGif.php里功能點(diǎn)的實(shí)現(xiàn)順序和方法:
1:定義編碼格式為“GIF89A”(GIF動(dòng)畫);定義一系列錯(cuò)誤信息的顯示內(nèi)容,定義幾個(gè)參數(shù)和數(shù)組參數(shù),做一些出錯(cuò)判斷,將所有GIF單幀圖片組成到一個(gè)數(shù)組里;
2:首先添加GIF頭部,由于GIF單幀圖已經(jīng)存儲(chǔ)成了字符,所有只需要讀取指定的字符串,利用數(shù)組的第一幀即可讀取指定參數(shù);這里充分利用了substr函數(shù)和一些轉(zhuǎn)義字符;
3:然后按序列逐個(gè)添加后續(xù)幀。利用一個(gè)FOR循環(huán),分布將gif擴(kuò)展參數(shù),GIF圖片參數(shù),GIF顏色參數(shù),GIF單幀圖的臨時(shí)字符組成到一起,連續(xù)將N張GIF圖片解碼組合在一起;
4:最后將得到的整串字符串重新編碼即得到GIF動(dòng)畫。