PHP利用FFmpeg實(shí)現(xiàn)獲取遠(yuǎn)程視頻的時(shí)長和截圖
突然發(fā)現(xiàn) FFmpeg 這個(gè)軟件還可以直接拉取遠(yuǎn)程視頻的相關(guān)信息,也就是可以不通過下載視頻到本地的方式,直接遠(yuǎn)程去獲取視頻時(shí)長和截圖。
假設(shè)我們的視頻url是:http://my.com/a.mp4
第一步,Linux 安裝 FFmpeg 軟件
第二步,通過composer安裝FFmpeg的庫
composer require php-ffmpeg/php-ffmpeg
1、獲取遠(yuǎn)程視頻時(shí)長
use FFMpeg\FFMpeg;
require 'vendor/autoload.php';
$ffmpeg = FFMpeg::create();
$video = $ffmpeg->open('https://xxx.mp4');
// 獲取視頻的時(shí)長(秒)
$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í)長(秒)
$duration = $video->getStreams()->first()->get('duration');
echo $duration;
$outputImage = '/data/b.jpg'; // 替換為您希望保存第一幀的物理路徑
// 提取第一幀(默認(rèn)情況下,F(xiàn)FMpeg庫將從視頻的開始處獲取第一幀)
$frame = $video->frame(TimeCode::fromSeconds(0));
// 將第一幀保存到指定的圖像文件
$frame->save($outputImage, 'image/jpeg');
經(jīng)測試,以上過程的調(diào)用,并不需要完全把視頻下載到本地再解析,可以實(shí)現(xiàn)遠(yuǎn)程獲取直接秒級返回!
3.知識(shí)補(bǔ)充
除了上文的方法,小編還為大家整理了一些其他PHP關(guān)于視頻文件的相關(guān)操作,希望對大家有所幫助
php 利用服務(wù)器liunx 獲取 視頻、音頻 時(shí)長,封面圖
/**
* 利用服務(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;
}//獲得視頻文件的總長度時(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/,//");//總長度
$duration = explode(":",$vtime);
$duration_in_secOnds= $duration[0]*3600 + $duration[1]*60+ round($duration[2]);//轉(zhuǎn)化為秒
return $duration_in_secOnds;
}PHP使用ffmpeg獲取視頻的時(shí)長和截取視頻圖片
// 獲取上傳的視頻斜體樣式
$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í)長信息
$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í)長和截圖的文章就介紹到這了,更多相關(guān)PHP FFmpeg獲取視頻時(shí)長和截圖內(nèi)容請搜索腳本之家以前的文章或繼續(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-06
PHP4和PHP5性能測試和對比 測試代碼與環(huán)境
PHP4和PHP5性能測試和對比 測試代碼與環(huán)境...2007-08-08
PHP 使用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

