亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > 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教程

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产欧美一区二区三区久久| 91sao在线观看国产| 性色av一区二区三区红粉影视| 日本久久久久久久| 国产精品久久久久久久久影视| 欧美第一黄色网| 亚洲人成网站色ww在线| 国产亚洲欧美另类中文| 国产免费一区二区三区香蕉精| 日韩在线观看免费高清完整版| 国产成人精品电影久久久| 亚州av一区二区| 午夜精品久久久久久久久久久久久| 18一19gay欧美视频网站| 国产欧美久久一区二区| 亚洲国产精品视频在线观看| 日韩精品中文字幕久久臀| 91免费人成网站在线观看18| y97精品国产97久久久久久| 欧美国产日韩一区| 久久视频免费在线播放| 欧美日韩成人在线观看| 久久久久久久激情视频| 一色桃子一区二区| 亚洲另类激情图| 国产性猛交xxxx免费看久久| 久久九九全国免费精品观看| 欧美成人精品在线观看| 日本一欧美一欧美一亚洲视频| 亚洲最大av在线| 亚洲直播在线一区| 国产精品91久久久久久| 81精品国产乱码久久久久久| 欧美做受高潮电影o| 成人网在线免费看| 成人情趣片在线观看免费| 国产91色在线| 久久久成人精品| 欧美wwwwww| 欧美激情图片区| 成人福利视频网| 亚洲免费av网址| 日韩a**中文字幕| 日韩av色在线| 日韩中文字幕在线精品| 亚洲国产高清自拍| 欧美日韩另类视频| 美女久久久久久久久久久| 欧美视频免费在线观看| 成人欧美一区二区三区黑人孕妇| 欧美激情欧美狂野欧美精品| 热99精品里视频精品| 色综合久久精品亚洲国产| 91成人在线视频| 成人午夜高潮视频| 国产精品视频一区二区三区四| 国产精品久久久久久久天堂| 92国产精品久久久久首页| 久久免费视频在线观看| 欧美猛少妇色xxxxx| 欧美日韩中文字幕在线视频| 亚洲美女免费精品视频在线观看| 成人欧美一区二区三区黑人孕妇| 久久免费成人精品视频| 91亚洲国产成人久久精品网站| 91久久国产婷婷一区二区| 91久久夜色精品国产网站| 国产精品日日摸夜夜添夜夜av| 国产日韩在线精品av| 成人免费看吃奶视频网站| 国产精品极品美女粉嫩高清在线| 亚洲最新视频在线| 日韩在线免费视频观看| 91九色在线视频| 亚洲一区二区三区视频播放| 国产在线观看一区二区三区| 欧美在线视频一区二区| 欧美日韩国产在线播放| 一个人www欧美| 最新的欧美黄色| 久久综合88中文色鬼| 国产91色在线免费| 久久久精品国产一区二区| 亚洲奶大毛多的老太婆| 欧美亚洲另类在线| 国产午夜精品免费一区二区三区| 国产精品吹潮在线观看| 亚洲综合一区二区不卡| 91经典在线视频| 成人啪啪免费看| 欧美麻豆久久久久久中文| 亚洲欧美成人在线| 日韩精品免费看| 国产精品7m视频| 欧美大片在线看免费观看| 欧美视频在线视频| 欧美高清性猛交| 国产啪精品视频网站| 欧美性videos高清精品| 亚洲精品国产综合区久久久久久久| 亚洲欧美日韩国产中文| 欧美电影在线播放| 日韩av日韩在线观看| 亚洲系列中文字幕| 国产精品嫩草视频| 亚洲成人网久久久| 欧美巨乳美女视频| 成人免费网站在线| 久久久久国色av免费观看性色| 亚洲女同性videos| 国产成人福利视频| 国产91精品网站| 日韩中文字幕在线免费观看| 91理论片午午论夜理片久久| 国产一区二区日韩精品欧美精品| 日韩在线视频网站| 在线观看国产精品淫| 青草热久免费精品视频| 久久99精品久久久久久青青91| 国产在线观看不卡| 欧美大奶子在线| 欧美性色19p| 国外成人在线直播| 国产精品高潮呻吟视频| 亚洲天堂男人的天堂| 亚洲va欧美va国产综合剧情| 久久精品欧美视频| 国产亚洲欧美日韩一区二区| 97香蕉久久超级碰碰高清版| 最新的欧美黄色| 日韩免费在线免费观看| 精品国内产的精品视频在线观看| 91精品国产91| 久久视频在线免费观看| 欧美日韩亚洲视频一区| 国产日韩欧美黄色| 国产成人精品电影久久久| 成人免费网站在线观看| 亚洲午夜激情免费视频| 亚洲黄页网在线观看| 久久精品夜夜夜夜夜久久| 国产亚洲美女精品久久久| 日韩日本欧美亚洲| 国产suv精品一区二区三区88区| 91爱爱小视频k| 欧美视频中文字幕在线| 亚洲无亚洲人成网站77777| 久久久亚洲精选| 久久久久久有精品国产| 亚洲欧美一区二区三区久久| 欧美激情一区二区三区久久久| 色偷偷888欧美精品久久久| 国产美女主播一区| 欧美成人免费全部观看天天性色| 欧美福利视频网站| 国产精品女主播| 日韩欧美精品中文字幕| 欧美成人午夜免费视在线看片| 亚洲第一中文字幕在线观看| 亚洲国产成人精品一区二区| 在线播放国产精品| 欧美成人免费在线观看| 成人国产精品久久久| 亚洲偷熟乱区亚洲香蕉av|