PHP利用FFmpeg實(shí)現(xiàn)獲取遠(yuǎn)程視頻的時(shí)長(zhǎng)和截圖
突然發(fā)現(xiàn) FFmpeg 這個(gè)軟件還可以直接拉取遠(yuǎn)程視頻的相關(guān)信息,也就是可以不通過下載視頻到本地的方式,直接遠(yuǎn)程去獲取視頻時(shí)長(zhǎng)和截圖。
假設(shè)我們的視頻url是:http://my.com/a.mp4
第一步,Linux 安裝 FFmpeg 軟件
第二步,通過composer安裝FFmpeg的庫(kù)
composer require php-ffmpeg/php-ffmpeg
1、獲取遠(yuǎn)程視頻時(shí)長(zhǎng)
use FFMpeg\FFMpeg; require 'vendor/autoload.php'; $ffmpeg = FFMpeg::create(); $video = $ffmpeg->open('https://xxx.mp4'); // 獲取視頻的時(shí)長(zhǎng)(秒) $duration = $video->getStreams()->first()->get('duration');
2、獲取遠(yuǎn)程視頻的第一幀
use FFMpeg\Coordinate\TimeCode; use FFMpeg\FFMpeg; require 'vendor/autoload.php'; $ffmpeg = FFMpeg::create(); $video = $ffmpeg->open('https://xxx.mp4'); // 獲取視頻的時(shí)長(zhǎng)(秒) $duration = $video->getStreams()->first()->get('duration'); echo $duration; $outputImage = '/data/b.jpg'; // 替換為您希望保存第一幀的物理路徑 // 提取第一幀(默認(rèn)情況下,F(xiàn)FMpeg庫(kù)將從視頻的開始處獲取第一幀) $frame = $video->frame(TimeCode::fromSeconds(0)); // 將第一幀保存到指定的圖像文件 $frame->save($outputImage, 'image/jpeg');
經(jīng)測(cè)試,以上過程的調(diào)用,并不需要完全把視頻下載到本地再解析,可以實(shí)現(xiàn)遠(yuǎn)程獲取直接秒級(jí)返回!
3.知識(shí)補(bǔ)充
除了上文的方法,小編還為大家整理了一些其他PHP關(guān)于視頻文件的相關(guān)操作,希望對(duì)大家有所幫助
php 利用服務(wù)器liunx 獲取 視頻、音頻 時(shí)長(zhǎng),封面圖
/** * 利用服務(wù)器ffmpeg命令截取視頻幀數(shù) * @param string $local_file_url 服務(wù)器文件路徑,以./開頭 * @param string $screenshot_local_file_url 保存的視頻截幀圖片路徑,以./開頭 * @param string $time 截取視頻秒數(shù) * @date 2021-06-24 */ function get_video_screenshot_by_ffmpeg($local_file_url, $screenshot_local_file_url, $time = 0) { $str = 'ffmpeg -i ' . $local_file_url . ' -y -f image2 -ss ' . $time . ' -t 0.001 ' . $screenshot_local_file_url; exec($str); return $screenshot_local_file_url; }
//獲得視頻文件的總長(zhǎng)度時(shí)間和創(chuàng)建時(shí)間 function get_video_time($local_file_url){ $vtime = exec("ffmpeg -i ".$local_file_url." 2>&1 | grep 'Duration' | cut -d ' ' -f 4 | sed s/,//");//總長(zhǎng)度 $duration = explode(":",$vtime); $duration_in_secOnds= $duration[0]*3600 + $duration[1]*60+ round($duration[2]);//轉(zhuǎn)化為秒 return $duration_in_secOnds; }
PHP使用ffmpeg獲取視頻的時(shí)長(zhǎng)和截取視頻圖片
// 獲取上傳的視頻斜體樣式 $files= $_FILES[‘file']; function upload_video($files){ // 判斷上傳是否正常 if ($files['error'] == 0){ $ext = strtolower(pathinfo(@$files['name'],PATHINFO_EXTENSION));// 截取上傳的視頻后綴 $allowExts = array("vob","ifo","mpg","mpeg","dat","mp4","3gp","mov","rm","ram","rmvb","wmv","asf","avi","asx");// 設(shè)置允許上傳的視頻后綴 $path = '../asj/video/'; // 設(shè)置附件上傳保持目錄 if (!in_array($ext, $allowExts)){ // 判斷上傳視頻后綴是否符合 $result = ['data' => '', 'code' => -1, 'message' => '非法文件類型!']; }else{ $fileName = date('Ymd').time();// 設(shè)置視頻新的名稱 $destName = $path.$fileName.".".$ext;// 保存視頻到指定路徑 // 判斷視頻上傳是否成功 if (!move_uploaded_file($files['tmp_name'], $destName)){ $result = ['data' => '', 'code' => -1, 'message' => '文件上傳失??!']; }else{ $outdata = array(); $outdata['path'] = "video/$fileName.$ext"; $ffmpeg = 'C:\\Windows\\System32\\ffmpeg\\bin\\ffmpeg.exe';// ffmpeg安裝的路徑 // 獲取視頻的相關(guān)信息 $data = get_video_info($ffmpeg, $destName, $fileName); $outdata['time'] = $data['time']; $outdata['img'] = $data['img']; $result = ['data' => $outdata, 'code' => 200, 'message' => '文件上傳成功!']; } } }else{ switch (@$files['error']) { case 1: $msg = "上傳的文件超過了 php.ini 中 upload_max_filesize 選項(xiàng)限制的值!"; break; case 2: $msg = "上傳文件的大小超過了 HTML 表單中 MAX_FILE_SIZE 選項(xiàng)指定的值!"; break; case 3: $msg = "文件只有部分被上傳!"; break; case 4: $msg = "沒有文件被上傳!"; break; case 6: case 7: $msg = "系統(tǒng)錯(cuò)誤!"; break; } $result = ['data' => '', 'code' => -1, 'message' => $msg]; }
如果exec()未正確返回參照
/** 獲取視頻的相關(guān)信息 @param $ffmpeg_path// ffmpeg.exe路徑 @param $video_path// 視頻的路徑 @param $fileName// 保存的圖片名稱和視頻的新名稱一致 @return array */ function get_video_info($ffmpeg_path, $video_path, $fileName){ if (!file_exists($video_path)) { return false; } // 獲取視頻時(shí)長(zhǎng)信息 $commond = " $ffmpeg_path -i $video_path 2>&1"; exec($commond, $str_res, $str_r); if (is_array($str_res)){ foreach($str_res as $v){ if (strpos( $v, 'Duration') !== false){ $times = substr($v, stripos($v , '.') - 8, 8);// 截取時(shí)分秒 $arr_duration = explode(':', $times);// 轉(zhuǎn)出相應(yīng)的數(shù)組 $seconds = $arr_duration[0] * 3600 + $arr_duration[1] * 60 + $arr_duration[2];//轉(zhuǎn)換播放時(shí)間為秒數(shù) break; } } } // 截取視頻圖片 $time = 1;// 根據(jù)時(shí)間截取視頻的圖片 $img_url = "..\\asj\\video\\imgs\\$fileName.jpg"; $img_name = "video/imgs/ $fileName.jpg"; exec(" $ffmpeg_path -i $video_path -f image2 -ss $time -s 320x240 -vframes 1 $img_url", $out, $status); $outdata = array(); $outdata['time'] = $seconds;// 秒數(shù) $outdata['img'] = $img_name; return $outdata;
到此這篇關(guān)于PHP利用FFmpeg實(shí)現(xiàn)獲取遠(yuǎn)程視頻的時(shí)長(zhǎng)和截圖的文章就介紹到這了,更多相關(guān)PHP FFmpeg獲取視頻時(shí)長(zhǎng)和截圖內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
PHP操作MySQL中BLOB字段的方法示例【存儲(chǔ)文本與圖片】
這篇文章主要介紹了PHP操作MySQL中BLOB字段的方法,結(jié)合具體實(shí)例形式分析了php使用mysql的BLOB字段存儲(chǔ)新聞內(nèi)容與圖片的相關(guān)操作技巧,需要的朋友可以參考下2017-09-09單臺(tái)服務(wù)器的PHP進(jìn)程之間實(shí)現(xiàn)共享內(nèi)存的方法
這篇文章主要介紹了單臺(tái)服務(wù)器的PHP進(jìn)程之間實(shí)現(xiàn)共享內(nèi)存的方法,需要的朋友可以參考下2014-06-06PHP4和PHP5性能測(cè)試和對(duì)比 測(cè)試代碼與環(huán)境
PHP4和PHP5性能測(cè)試和對(duì)比 測(cè)試代碼與環(huán)境...2007-08-08PHP 使用Echarts生成數(shù)據(jù)統(tǒng)計(jì)報(bào)表的實(shí)現(xiàn)代碼
這篇文章主要介紹了PHP 使用Echarts生成數(shù)據(jù)統(tǒng)計(jì)報(bào)表的實(shí)現(xiàn)代碼,需要的朋友可以參考下2018-01-01