加入收藏 | 设为首页 | 会员中心 | 我要投稿 汽车网 (https://www.0577qiche.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

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

发布时间:2023-09-20 10:23:07 所属栏目:PHP教程 来源:
导读:这里把ffmpeg 和 生成缩略图整合了一下:

include("ImageResize.class.php")
//转视频
$cmd="ffmpeg.exe -i starwar.avi -ab 56 -ar 22050 -b 500 -r 15 -s 320x240 1.flv";
exec($cmd);
//视频截图
这里把ffmpeg 和  生成缩略图整合了一下:

include("ImageResize.class.php") 
 //转视频 
 $cmd="ffmpeg.exe -i starwar.avi -ab 56 -ar 22050 -b 500 -r 15 -s 320x240 1.flv"; 
 exec($cmd); 
 //视频截图 
 $cmd="ffmpeg.exe -i starwar.avi -f image2 -ss 10 -s 400*300 -vframes 1 1.jpg"; 
 exec($cmd); 
 //生成缩略图 
 $thumbnail=newImageResize(); 
 $thumbnail->resizeimage("1.jpg", 30,30, 0,"small1.jpg"); 
classImageResize { 
  //图片类型 
  var$type; 
  //实际宽度 
  var$width; 
  //实际高度 
  var$height; 
  //改变后的宽度 
  var$resize_width; 
  //改变后的高度 
  var$resize_height; 
  //是否裁图 
  var$cut; 
  //源图象 
  var$srcimg; 
  //目标图象地址 
  var$dstimg; 
  //临时创建的图象 
  var$im; 
functionresizeimage($img,$wid,$hei,$c,$dstpath) { 
    $this->srcimg =$img; 
    $this->resize_width =$wid; 
    $this->resize_height =$hei; 
    $this->cut =$c; 
    //图片的类型 
    $this->type =strtolower(substr(strrchr($this->srcimg,"."),1)); 
    //初始化图象 
    $this->initi_img(); 
    //目标图象地址 
    $this-> dst_img($dstpath); 
    //-- 
    $this->width = imagesx($this->im); 
    $this->height = imagesy($this->im); 
    //生成图象 
    $this->newimg(); 
    ImageDestroy ($this->im); 
  } 
functionnewimg() { 
//改变后的图象的比例 
    $resize_ratio= ($this->resize_width)/($this->resize_height); 
//实际图象的比例 
    $ratio= ($this->width)/($this->height); 
if(($this->cut)=="1") { 
      //裁图 高度优先 
      if($ratio>=$resize_ratio){ 
        $newimg= imagecreatetruecolor($this->resize_width,$this->resize_height); 
        imagecopyresampled($newimg,$this->im, 0, 0, 0, 0,$this->resize_width,$this->resize_height, (($this->height)*$resize_ratio),$this->height); 
        ImageJpeg ($newimg,$this->dstimg); 
      } 
      //裁图 宽度优先 
      if($ratio<$resize_ratio) { 
        $newimg= imagecreatetruecolor($this->resize_width,$this->resize_height); 
        imagecopyresampled($newimg,$this->im, 0, 0, 0, 0,$this->resize_width,$this->resize_height,$this->width, (($this->width)/$resize_ratio)); 
        ImageJpeg ($newimg,$this->dstimg); 
      } 
    }else{ 
      //不裁图 
      if($ratio>=$resize_ratio) { 
        $newimg= imagecreatetruecolor($this->resize_width,($this->resize_width)/$ratio); 
        imagecopyresampled($newimg,$this->im, 0, 0, 0, 0,$this->resize_width, ($this->resize_width)/$ratio,$this->width,$this->height); 
        ImageJpeg ($newimg,$this->dstimg); 
      } 
      if($ratio<$resize_ratio) { 
        $newimg= imagecreatetruecolor(($this->resize_height)*$ratio,$this->resize_height); 
        imagecopyresampled($newimg,$this->im, 0, 0, 0, 0, ($this->resize_height)*$ratio,$this->resize_height,$this->width,$this->height); 
        ImageJpeg ($newimg,$this->dstimg); 
      } 
    } 
  } 
//初始化图象 
  functioniniti_img() { 
    if($this->type=="jpg") { 
      $this->im = imagecreatefromjpeg($this->srcimg); 
    } 
    if($this->type=="gif") { 
      $this->im = imagecreatefromgif($this->srcimg); 
    } 
    if($this->type=="png") { 
      $this->im = imagecreatefrompng($this->srcimg); 
    } 
    if($this->type=="bmp") { 
      $this->im =$this->imagecreatefrombmp($this->srcimg); 
    } 
  } 
//图象目标地址 
  functiondst_img($dstpath) { 
    $full_length=strlen($this->srcimg); 
    $type_length=strlen($this->type); 
    $name_length=$full_length-$type_length; 
    $name=substr($this->srcimg,0,$name_length-1); 
    $this->dstimg =$dstpath; 
    //echo $this->dstimg; 
  } 
  functionConvertBMP2GD($src,$dest= false) { 
    if(!($src_f=fopen($src,"rb"))) { 
      returnfalse; 
    } 
    if(!($dest_f=fopen($dest,"wb"))) { 
      returnfalse; 
    } 
    $header= unpack("vtype/Vsize/v2reserved/Voffset",fread($src_f,14)); 
    $info= unpack("Vsize/Vwidth/Vheight/vplanes/vbits/Vcompression/Vimagesize/Vxres/Vyres/Vncolor/Vimportant",fread($src_f, 40)); 
    extract($info); 
    extract($header); 
    if($type!= 0x4D42) {// signature "BM" 
      returnfalse; 
    } 
    $palette_size=$offset- 54; 
    $ncolor=$palette_size/ 4; 
    $gd_header=""; 
    // true-color vs. palette 
    $gd_header.= ($palette_size== 0) ?"/xFF/xFE":"/xFF/xFF"; 
    $gd_header.= pack("n2",$width,$height); 
    $gd_header.= ($palette_size== 0) ?"/x01":"/x00"; 
    if($palette_size) { 
      $gd_header.= pack("n",$ncolor); 
    } 
    // no transparency 
    $gd_header.="/xFF/xFF/xFF/xFF"; 
fwrite($dest_f,$gd_header); 
if($palette_size) { 
      $palette=fread($src_f,$palette_size); 
      $gd_palette=""; 
      $j= 0; 
      while($j<$palette_size) { 
        $b=$palette{$j++}; 
        $g=$palette{$j++}; 
        $r=$palette{$j++}; 
        $a=$palette{$j++}; 
        $gd_palette.="$r$g$b$a"; 
      } 
      $gd_palette.=str_repeat("/x00/x00/x00/x00", 256 -$ncolor); 
      fwrite($dest_f,$gd_palette); 
    } 
$scan_line_size= (($bits*$width) + 7) >> 3; 
    $scan_line_align= ($scan_line_size& 0x03) ? 4 - ($scan_line_size& 
    0x03) : 0; 
for($i= 0,$l=$height- 1;$i<$height;$i++,$l--) { 
      // BMP stores scan lines starting from bottom 
      fseek($src_f,$offset+ (($scan_line_size+$scan_line_align) *$l)); 
      $scan_line=fread($src_f,$scan_line_size); 
      if($bits== 24) { 
        $gd_scan_line=""; 
        $j= 0; 
        while($j<$scan_line_size) { 
          $b=$scan_line{$j++}; 
          $g=$scan_line{$j++}; 
          $r=$scan_line{$j++}; 
          $gd_scan_line.="/x00$r$g$b"; 
        } 
      } 
      elseif($bits== 8) { 
        $gd_scan_line=$scan_line; 
      } 
      elseif($bits== 4) { 
        $gd_scan_line=""; 
        $j= 0; 
        while($j<$scan_line_size) { 
          $byte= ord($scan_line{$j++}); 
          $p1=chr($byte>> 4); 
          $p2=chr($byte& 0x0F); 
          $gd_scan_line.="$p1$p2"; 
        } 
        $gd_scan_line=substr($gd_scan_line, 0,$width); 
      } 
      elseif($bits== 1) { 
        $gd_scan_line=""; 
        $j= 0; 
        while($j<$scan_line_size) { 
          $byte= ord($scan_line{$j++}); 
          $p1=chr((int) (($byte& 0x80) != 0)); 
          $p2=chr((int) (($byte& 0x40) != 0)); 
          $p3=chr((int) (($byte& 0x20) != 0)); 
          $p4=chr((int) (($byte& 0x10) != 0)); 
          $p5=chr((int) (($byte& 0x08) != 0)); 
          $p6=chr((int) (($byte& 0x04) != 0)); 
          $p7=chr((int) (($byte& 0x02) != 0)); 
          $p8=chr((int) (($byte& 0x01) != 0)); 
          $gd_scan_line.="$p1$p2$p3$p4$p5$p6$p7$p8"; 
        } 
        $gd_scan_line=substr($gd_scan_line, 0,$width); 
      } 
      fwrite($dest_f,$gd_scan_line); 
    } 
    fclose($src_f); 
    fclose($dest_f); 
    returntrue; 
  } 
functionimagecreatefrombmp($filename) { 
    $tmp_name= tempnam("/tmp","GD"); 
    if($this->ConvertBMP2GD($filename,$tmp_name)) { 
      $img= imagecreatefromgd($tmp_name); 
      unlink($tmp_name); 
      return$img; 
    } 
    returnfalse; 
  } 

 

(编辑:汽车网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章