国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > PHP > 正文

PHP調用ffmpeg對視頻截圖并拼接腳本

2020-03-22 20:13:52
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了PHP調用ffmpeg對視頻截圖并拼接腳本

PHP腳本調用ffmpeg對視頻截圖并拼接,供大家參考,具體內容如下

目前支持MKV,MPG,MP4等常見格式的視頻,其他格式有待測試

12P 一張截圖平均生成時間 1.64s 100個視頻,大概需要2分半左右

9P 一張截圖平均生成時間 1.13s 100個視頻,大概需要2分鐘左右

6P 一張截圖平均生成時間 0.86s 100個視頻,大概需要1分半左右

3P 一張截圖平均生成時間 0.54s 100個視頻,大概需要1分鐘左右


 ?php define( DS , DIRECTORY_SEPARATOR); date_default_timezone_set( Asia/Shanghai html' target='_blank'>class FileLoader  //路徑變量  private $rootdir =  private $tmp = tmp //tmp 目錄  private $source = mpg //source 目錄  private $destination = screenshoot //目標截圖路徑  private $emptyImageName = empty.jpg //合成的背景圖  //文件數組  private $maxShoots = 12; //最大的截圖數  private $videoInfo = NULL;  private $files = array(); //文件數  private $fileArray = array();  private $extensionArray = array( mpg , mkv , mp4 , avi , 3gp , mov //支持的格式  private $timeArray = array( 00:00:10 , 00:00:20 , 00:00:30 , 00:01:00 , 00:01:30 , 00:02:00 , 00:02:30 , 00:03:00 , 00:03:30 , 00:03:40 , 00:03:50 , 00:04:00  //統計變量  private $timeStart = 0;  private $timeEnd = 0;  private $fileCount = 0;  private $successCount = 0;  private $failedCount = 0;  /**  * 初始化信息  function __construct()  file_put_contents( log.txt ,  $this- rootdir = dirname(__FILE__);  $count = count($this- timeArray);  for($i=1;$i =$count;$i++)  $ii = $i-1;  $this- fileArray[$ii] = $this- tmp.DS.$i. .jpg  /**  * 當前時間,精確到小數點  private static function microtime_float()  list($usec, $sec)= explode( , microtime());  return ((float)$usec + (float)$sec);  /**  * 00:00:00 時間轉秒  private static function timeToSec($time)  $p = explode( : ,$time);  $c = count($p);  if ($c 1)  $hour = intval($p[0]);  $minute = intval($p[1]);  $sec = intval($p[2]);  else  throw new Exception( error time format  $secs = $hour * 3600 + $minute * 60 + $sec;  return $secs;  /**  * 00:00:00 時間轉秒  private static function secToTime($time)  $hour = floor($time/3600);  $min = floor(($time - $hour * 3600)/60);  $sec = $time % 60;  $timeStr = sprintf( %02d:%02d:%02d ,$hour,$min,$sec);  return $timeStr;  /**  * 獲取全部文件  private function getFiles($dir)  $files = array();  $dir = rtrim($dir, /// ) . DS;  $dh = opendir($dir);  if ($dh == false) { return $files; }  while (($file = readdir($dh)) != false)  if ($file{0} == . ) { continue; }  $path = $dir . $file;  if (is_dir($path))  $files = array_merge($files, $this- getFiles($path));  elseif (is_file($path))  $files[] = $path;  closedir($dh);  return $files;  /**  * 搜索路徑  public function searchDir($sourcePath = NULL)  $this- timeStart = $this- microtime_float();  if ($sourcePath)  $this- rootdir = $sourcePath;  if (file_exists($this- rootdir) is_dir($this- rootdir))  $this- files = $this- getFiles($this- rootdir.DS.$this- source);  $this- fileCount = count($this- files);  foreach ($this- files as $path)  $fi = pathinfo($path);  $flag = array_search(strtolower($fi[ extension ]),$this- extensionArray);  if (!$flag) continue;  $this- getScreenShoot(basename($path));  $this- timeEnd = $this- microtime_float();  $time = $this- timeEnd - $this- timeStart;  if($this- fileCount 0)  $str = sprintf( [TOTAL]: Cost Time:%8s | Total File:[%d] | Successed:[%d] | Failed:[%d] | Speed:%.2fs per file/n ,$this- secToTime($time),$this- fileCount,$this- successCount,$this- failedCount,$time/$this- fileCount);  file_put_contents( log.txt ,$str,FILE_APPEND);  else  $str = sprintf( [TOTAL]: Cost Time:%8s | Total File:[%d] | Successed:[%d] | Failed:[%d] | Speed:%.2fs per file/n ,$this- secToTime($time),$this- fileCount,$this- successCount,$this- failedCount,0);  file_put_contents( log.txt ,$str,FILE_APPEND);  /**  * 獲取視頻信息  private function getVideoInfo($file){  $re = array();  exec( . .DS. ffmpeg -i {$file} 2 1 , $re);  $info = implode( /n , $re);  if(preg_match( /No such file or directory/i , $info))  return false;  if(preg_match( /Invalid data/i , $info)){  return false;  $match = array();  preg_match( //d{2,}x/d+/ , $info, $match);  list($width, $height) = explode( x , $match[0]);  $match = array();  preg_match( /Duration:(.*?),/ , $info, $match);  if($match)  $duration = date( H:i:s , strtotime($match[1]));  }else  $duration = NULL;  $match = array();  preg_match( /bitrate:(.*kb//s)/ , $info, $match);  $bitrate = $match[1];  if(!$width !$height !$duration !$bitrate){  return false;  }else{  return array(  file = $file,  width = $width,  height = $height,  duration = $duration,  bitrate = $bitrate,  secends = $this- timeToSec($duration) 
$target = $this- rootdir.DS.$this- emptyImageName;//背景圖片 $target_img = Imagecreatefromjpeg($target); $source= array(); foreach ($this- fileArray as $k= $v) $source[$k][ source ] = Imagecreatefromjpeg($v); $source[$k][ size ] = getimagesize($v); $tmpx=5; $tmpy=5;//圖片之間的間距 for ($i=0; $i count($this- timeArray); $i++) imagecopy($target_img,$source[$i][ source ],$tmpx,$tmpy,0,0,$source[$i][ size ][0],$source[$i][ size ][1]); $target_img = $this- setTimeLabel($target_img,$tmpx,$tmpy,$source[$i][ size ][0],$source[$i][ size ][1],$this- timeArray[$i]); $tmpx = $tmpx+ $source[$i][ size ][0]; $tmpx = $tmpx+5; if(($i+1) %3 == 0){ $tmpy = $tmpy+$source[$i][ size ][1]; $tmpy = $tmpy+5; $tmpx=5; $target_img = $this- setVideoInfoLabel($target_img,$tmpx,$tmpy,$this- videoInfo); Imagejpeg($target_img,$this- rootdir.DS.$this- destination.DS.$fileName. .jpg /** * 設置時間刻度標簽 private function setTimeLabel($image,$image_x,$image_y,$image_w,$image_h,$img_text) imagealphablending($image,true); //設定顏色 $color=imagecolorallocate($image,255,255,255); $ttf_im=imagettfbbox(30 ,0, Arial.ttf ,$this- img_text); $w = $ttf_im[2] - $ttf_im[6]; $h = $ttf_im[3] - $ttf_im[7]; unset($ttf_im); $txt_y =$image_y+$image_h+$h-5; $txt_x =$image_x+$w+5; imagettftext($image,30,0,$txt_x,$txt_y,$color, Arial.ttf ,$img_text); return $image; /** * 設置視頻信息標簽 private function setVideoInfoLabel($image,$txt_x,$txt_y,$videoInfo) imagealphablending($image,true); $color=imagecolorallocate($image,0,0,0); imagettftext($image,32,0,100,2000+30,$color, FZLTHJW.ttf , FileName: .basename($videoInfo[ file ])); imagettftext($image,32,0,1600,2000+30,$color, Arial.ttf , Size: .$videoInfo[ width ]. x .$videoInfo[ height ]); imagettftext($image,32,0,100,2000+120,$color, Arial.ttf , Duration: .$videoInfo[ duration ]); imagettftext($image,32,0,1600,2000+120,$color, Arial.ttf , Bitrate: .$videoInfo[ bitrate ]); return $image; /** * 屏幕截圖 public function getScreenShoot($fileName) $fi = pathinfo($fileName); $this- videoInfo = $this- getVideoInfo($this- rootdir.DS.$this- source.DS.$fileName); if($this- videoInfo) $this- setShootSecends($this- videoInfo[ secends ]); for ($i=0; $i count($this- timeArray); $i++ ) $cmd= . .DS. ffmpeg -ss . $this- timeArray[$i] . -i . $this- rootdir.DS.$this- source.DS.$fileName . -y -f image2 -s 720*480 -vframes 1 .$this- rootdir.DS.$this- fileArray[$i]; exec($cmd,$out,$status); $this- getFixedPhoto($fileName); $str = sprintf( [%s]:OK...........[%s][%2dP]%-30s/n ,date( y-m-d h:i:s ,time()),$this- videoInfo[ duration ],count($this- timeArray),$fileName); file_put_contents( log.txt ,$str,FILE_APPEND); $this- successCount += 1; }else $str = sprintf( [%s]:FAILED.................................[%s][%2dP]%-30s/n ,date( y-m-d h:i:s ,time()),$this- videoInfo[ duration ],count($this- timeArray),$fileName); file_put_contents( log.txt ,$str,FILE_APPEND); $this- failedCount += 1; /** * TODO: * 截取圖片, * 需要配置ffmpeg-php,比較麻煩, * 但是這個類確實挺好用的。 public function getScreenShoot2($fileName) if(extension_loaded( ffmpeg )){//判斷ffmpeg是否載入 $mov = new ffmpeg_movie($this- rootdir.DS.$this- source.DS.$fileName);//視頻的路徑 $count = $mov- getFrameCount(); $ff_frame = $mov- getFrame(floor($count/2)); if($ff_frame) $gd_image = $ff_frame- toGDImage(); $img=$this- rootdir.DS. test.jpg //要生成圖片的絕對路徑 imagejpeg($gd_image, $img);//創建jpg圖像 imagedestroy($gd_image);//銷毀一圖像 }else{ echo ffmpeg沒有載入 $fileLoader = new FileLoader(); $fileLoader- searchDir(); ?

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持php 。

您可能感興趣的文章:

Yii2中的場景(scenario)和驗證規則(rule)的詳解

MixPHP、Yii和CodeIgniter的并發壓力測試的小結

PHP基于非遞歸算法實現先序、中序及后序遍歷二叉樹操作的示例

以上就是PHP調用ffmpeg對視頻截圖并拼接腳本的詳細內容,PHP教程

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 台中市| 积石山| 无为县| 五河县| 巨鹿县| 昔阳县| 泸定县| 新竹市| 彭阳县| 天祝| 夏河县| 秦安县| 平乐县| 金寨县| 重庆市| 吉木乃县| 东宁县| 阿瓦提县| 和静县| 扶风县| 汝城县| 四平市| 将乐县| 衡山县| 城口县| 澄迈县| 新乐市| 芜湖县| 五台县| 宁陵县| 光山县| 辛集市| 杂多县| 罗平县| 库尔勒市| 乐平市| 新乡县| 濮阳县| 班戈县| 车险| 汾西县|