当前位置:首页 > PHP教程 > php高级应用 > 列表

PHP基于ffmpeg实现转换视频,截图及生成缩略图的方法

发布:smiling 来源: PHP粉丝网  添加日期:2018-08-31 10:27:37 浏览: 评论:0 

这里把ffmpeg 和  生成缩略图整合了一下:

  1. include("ImageResize.class.php"
  2.  //转视频 
  3.  $cmd="ffmpeg.exe -i starwar.avi -ab 56 -ar 22050 -b 500 -r 15 -s 320x240 1.flv"
  4.  exec($cmd); 
  5.  //视频截图 
  6.  $cmd="ffmpeg.exe -i starwar.avi -f image2 -ss 10 -s 400*300 -vframes 1 1.jpg"
  7.  exec($cmd); 
  8.  //生成缩略图 
  9.  $thumbnail=newImageResize(); 
  10.  $thumbnail->resizeimage("1.jpg", 30,30, 0,"small1.jpg"); 
  11. classImageResize { 
  12.   //图片类型 
  13.   var$type
  14.   //实际宽度 
  15.   var$width
  16.   //实际高度 
  17.   var$height
  18.   //改变后的宽度 
  19.   var$resize_width
  20.   //改变后的高度 
  21.   var$resize_height
  22.   //是否裁图 
  23.   var$cut
  24.   //源图象 
  25.   var$srcimg
  26.   //目标图象地址 
  27.   var$dstimg
  28.   //临时创建的图象 
  29.   var$im
  30. functionresizeimage($img,$wid,$hei,$c,$dstpath) { 
  31.     $this->srcimg =$img
  32.     $this->resize_width =$wid
  33.     $this->resize_height =$hei
  34.     $this->cut =$c
  35.     //图片的类型 
  36.     $this->type =strtolower(substr(strrchr($this->srcimg,"."),1)); 
  37.     //初始化图象 
  38.     $this->initi_img(); 
  39.     //目标图象地址 
  40.     $this-> dst_img($dstpath); 
  41.     //-- 
  42.     $this->width = imagesx($this->im); 
  43.     $this->height = imagesy($this->im); 
  44.     //生成图象 
  45.     $this->newimg(); 
  46.     ImageDestroy ($this->im); 
  47.   } 
  48. functionnewimg() { 
  49. //改变后的图象的比例 
  50.     $resize_ratio= ($this->resize_width)/($this->resize_height); 
  51. //实际图象的比例 
  52.     $ratio= ($this->width)/($this->height); 
  53. if(($this->cut)=="1") { 
  54.       //裁图 高度优先 
  55.       if($ratio>=$resize_ratio){ 
  56.         $newimg= imagecreatetruecolor($this->resize_width,$this->resize_height); 
  57.         imagecopyresampled($newimg,$this->im, 0, 0, 0, 0,$this->resize_width,$this->resize_height, (($this->height)*$resize_ratio),$this->height); 
  58.         ImageJpeg ($newimg,$this->dstimg); 
  59.       } 
  60.       //裁图 宽度优先 
  61.       if($ratio<$resize_ratio) { 
  62.         $newimg= imagecreatetruecolor($this->resize_width,$this->resize_height); 
  63.         imagecopyresampled($newimg,$this->im, 0, 0, 0, 0,$this->resize_width,$this->resize_height,$this->width, (($this->width)/$resize_ratio)); 
  64.         ImageJpeg ($newimg,$this->dstimg); 
  65.       } 
  66.     }else
  67.       //不裁图 
  68.       if($ratio>=$resize_ratio) { 
  69.         $newimg= imagecreatetruecolor($this->resize_width,($this->resize_width)/$ratio); 
  70.         imagecopyresampled($newimg,$this->im, 0, 0, 0, 0,$this->resize_width, ($this->resize_width)/$ratio,$this->width,$this->height); 
  71.         ImageJpeg ($newimg,$this->dstimg); 
  72.       } 
  73.       if($ratio<$resize_ratio) { 
  74.         $newimg= imagecreatetruecolor(($this->resize_height)*$ratio,$this->resize_height); 
  75.         imagecopyresampled($newimg,$this->im, 0, 0, 0, 0, ($this->resize_height)*$ratio,$this->resize_height,$this->width,$this->height); 
  76.         ImageJpeg ($newimg,$this->dstimg); 
  77.       } 
  78.     } 
  79.   } 
  80. //初始化图象 
  81.   functioniniti_img() { 
  82.     if($this->type=="jpg") { 
  83.       $this->im = imagecreatefromjpeg($this->srcimg); 
  84.     } 
  85.     if($this->type=="gif") { 
  86.       $this->im = imagecreatefromgif($this->srcimg); 
  87.     } 
  88.     if($this->type=="png") { 
  89.       $this->im = imagecreatefrompng($this->srcimg); 
  90.     } 
  91.     if($this->type=="bmp") { 
  92.       $this->im =$this->imagecreatefrombmp($this->srcimg); 
  93.     } 
  94.   } 
  95. //图象目标地址 
  96.   functiondst_img($dstpath) { 
  97.     $full_length=strlen($this->srcimg); 
  98.     $type_length=strlen($this->type); 
  99.     $name_length=$full_length-$type_length
  100.     $name=substr($this->srcimg,0,$name_length-1); 
  101.     $this->dstimg =$dstpath
  102.     //echo $this->dstimg; 
  103.   } 
  104.   functionConvertBMP2GD($src,$dest= false) { 
  105.     if(!($src_f=fopen($src,"rb"))) { 
  106.       returnfalse; 
  107.     } 
  108.     if(!($dest_f=fopen($dest,"wb"))) { 
  109.       returnfalse; 
  110.     } 
  111.     $header= unpack("vtype/Vsize/v2reserved/Voffset",fread($src_f,14)); 
  112.     $info= unpack("Vsize/Vwidth/Vheight/vplanes/vbits/Vcompression/Vimagesize/Vxres/Vyres/Vncolor/Vimportant",fread($src_f, 40)); 
  113.     extract($info); 
  114.     extract($header); 
  115.     if($type!= 0x4D42) {// signature "BM" 
  116.       returnfalse; 
  117.     } 
  118.     $palette_size=$offset- 54; 
  119.     $ncolor=$palette_size/ 4; 
  120.     $gd_header=""
  121.     // true-color vs. palette 
  122.     $gd_header.= ($palette_size== 0) ?"\xFF\xFE":"\xFF\xFF"
  123.     $gd_header.= pack("n2",$width,$height); 
  124.     $gd_header.= ($palette_size== 0) ?"\x01":"\x00"
  125.     if($palette_size) { 
  126.       $gd_header.= pack("n",$ncolor); 
  127.     } 
  128.     // no transparency 
  129.     $gd_header.="\xFF\xFF\xFF\xFF"
  130. fwrite($dest_f,$gd_header); 
  131. if($palette_size) { 
  132.       $palette=fread($src_f,$palette_size); 
  133.       $gd_palette=""
  134.       $j= 0; 
  135.       while($j<$palette_size) { 
  136.         $b=$palette{$j++}; 
  137.         $g=$palette{$j++}; 
  138.         $r=$palette{$j++}; 
  139.         $a=$palette{$j++}; 
  140.         $gd_palette.="$r$g$b$a"
  141.       } 
  142.       $gd_palette.=str_repeat("\x00\x00\x00\x00", 256 -$ncolor); 
  143.       fwrite($dest_f,$gd_palette); 
  144.     } 
  145. $scan_line_size= (($bits*$width) + 7) >> 3; 
  146.     $scan_line_align= ($scan_line_size& 0x03) ? 4 - ($scan_line_size
  147.     0x03) : 0; 
  148. for($i= 0,$l=$height- 1;$i<$height;$i++,$l--) { 
  149.       // BMP stores scan lines starting from bottom 
  150.       fseek($src_f,$offset+ (($scan_line_size+$scan_line_align) *$l)); 
  151.       $scan_line=fread($src_f,$scan_line_size); 
  152.       if($bits== 24) { 
  153.         $gd_scan_line=""
  154.         $j= 0; 
  155.         while($j<$scan_line_size) { 
  156.           $b=$scan_line{$j++}; 
  157.           $g=$scan_line{$j++}; 
  158.           $r=$scan_line{$j++}; 
  159.           $gd_scan_line.="\x00$r$g$b"
  160.         } 
  161.       } 
  162.       elseif($bits== 8) { 
  163.         $gd_scan_line=$scan_line
  164.       } 
  165.       elseif($bits== 4) { 
  166.         $gd_scan_line=""
  167.         $j= 0; 
  168.         while($j<$scan_line_size) { 
  169.           $byte= ord($scan_line{$j++}); 
  170.           $p1=chr($byte>> 4); 
  171.           $p2=chr($byte& 0x0F); 
  172.           $gd_scan_line.="$p1$p2"
  173.         } 
  174.         $gd_scan_line=substr($gd_scan_line, 0,$width); 
  175.       } 
  176.       elseif($bits== 1) { 
  177.         $gd_scan_line=""
  178.         $j= 0; 
  179.         while($j<$scan_line_size) { 
  180.           $byte= ord($scan_line{$j++}); 
  181.           $p1=chr((int) (($byte& 0x80) != 0)); 
  182.           $p2=chr((int) (($byte& 0x40) != 0)); 
  183.           $p3=chr((int) (($byte& 0x20) != 0)); 
  184.           $p4=chr((int) (($byte& 0x10) != 0)); 
  185.           $p5=chr((int) (($byte& 0x08) != 0)); 
  186.           $p6=chr((int) (($byte& 0x04) != 0)); 
  187.           $p7=chr((int) (($byte& 0x02) != 0)); 
  188.           $p8=chr((int) (($byte& 0x01) != 0)); 
  189.           $gd_scan_line.="$p1$p2$p3$p4$p5$p6$p7$p8"
  190.         } 
  191.         $gd_scan_line=substr($gd_scan_line, 0,$width); 
  192.       } 
  193.       fwrite($dest_f,$gd_scan_line); 
  194.     } 
  195.     fclose($src_f); 
  196.     fclose($dest_f); 
  197.     returntrue; 
  198.   } 
  199. functionimagecreatefrombmp($filename) { 
  200.     $tmp_name= tempnam("/tmp","GD"); 
  201.     if($this->ConvertBMP2GD($filename,$tmp_name)) { 
  202.       $img= imagecreatefromgd($tmp_name); 
  203.       unlink($tmp_name); 
  204.       return$img
  205.     } 
  206.     returnfalse; 
  207.   } 

Tags: 截图 方法 视频

分享到: