?

? ? 在这里简要介绍一下搭建视频网站所需要的软件,这些软件包括ffmpeg、mplayer。它们主要用来负责视频的转码工作,ffmpeg基本上对所有格式的视频文件都可以处理,但是对rmvb和rm格式的视频无法转码,这个时候,就需要通过MPlayer转码工具的协助,完成转码任务。

? ? 如果要在网页上播放,就需要转码。如果采用flash播放器播放视频,这个时候就需要转码出flv格式的视频;如果采用html5或者pad播放,就需要转码出MP4格式的视频。在转码的处理中,我们通常会分别转码出两种视频,分别是高清和流畅视频,方便不同网速的用户观看。class VideoConvert{//视频的原始文件var $src;//后缀名var $suffix;//视频实际类型var $format;//视频md5value: 在tester中主要用于生成同级目录下的缩略图的初始位置var $md5value;//视频长度var $ori_length;//视频信息var $src_identify = array();//错误日志var $err_log = array();//指令地址var $system_mencoder = '/usr/bin/mencoder ';var $system_ffmpeg = '/usr/local/bin/ffmpeg ';var $system_mplayer = '/usr/bin/mplayer ';var $system_yamdi = '/usr/local/bin/yamdi ';var $system_qtfaststart = '/usr/local/bin/qt-faststart ';function __construct($filePath) {$this->src = $filePath;//源文件不存在if (!file_exists($this->src)) {print_r("the file[$this->src] not exists.\r\n

");} else {print_r("the file[$this->src] exists.\r\n

");}}function init() {//截取后缀名$this->suffix = strtolower(substr($this->src, strrpos($this->src, '.'))); //读取文件内容的前3个字节,判断真实文件格式$handle = fopen($this->src, 'r'); $this->format = strtolower(fread($handle, 3)); fclose($handle);//视频的md5值$this->md5value = md5_file( $this->src );//inentify$this->src_identify =$this->getIdentify($this->src);//视频长度$this->ori_length = $this->src_identify['id_length'];$this->ori_length = empty($this->ori_length)?0:$this->ori_length;}function showInfo() {$this->pr("后缀类型:$this->suffix");$this->pr("实际类型:$this->format");$this->pr("md5value:$this->md5value");$this->pr("ori_length:$this->ori_length");$this->pr("id_demuxer:".$this->src_identify['id_demuxer']);$this->pr("id_video_format:".$this->src_identify['id_video_format']);}function rmvb2avi($src, $dst, $identify) {//$cmd = $this->system_mencoder." $src -o ".$src."_ -of avi -oac mp3lame -ovc xvid -xvidencopts bitrate=$datarate";if($identify['id_video_format'] == 'WMV3') {$cmd = $this->system_mencoder." $src -o $dst -of avi -oac mp3lame -ovc copy";} else {$cmd = $this->system_mencoder." $src -o $dst -of avi -oac mp3lame -ovc xvid -xvidencopts fixed_quant=11";}$this->pr($cmd);$handle = @popen($cmd, 'r');while (!feof($handle)) {$line = fgets($handle, 1024);}@pclose($handle);return true;}function video2f4v($src, $dst, $datarate) {$cmd = $this->system_ffmpeg." -i ".$src." -f flv -acodec libfaac -ab 16k -vcodec libx264 -coder 1 -g 250 -keyint_min 25 -sc_threshold 40 -bf 3 -b_strategy 1 -partitions +parti8x8+parti4x4+partp8x8+partb8x8 -directpred 1 -flags +loop -deblockalpha 0 -deblockbeta 0 -flags2 +fastpskip+wpred-dct8x8 -me_method hex -me_range 16 -subq 6 -trellis 1 -b ".$datarate."k -qcomp 1 -i_qfactor 0.71 -qmin 10 -qmax 51 -qdiff 4 -r 29.97 -y ".$dst;//." 2>&1";$this->pr($cmd);$handle = @popen($cmd, 'r');while(!feof($handle)) {$line = fgets($handle, 1024);}@pclose($handle);return true;}function video2flv($src, $dst) {$cmd = $this->system_ffmpeg." -i $src -f flv -vcodec flv -ar 22050 -acodec libmp3lame -y $dst";// 2>&1";$this->pr($cmd);$handle = @popen($cmd, 'r');while(!feof($handle)) {$line = fgets($handle, 1024);}@pclose($handle);return true;}//转换mp4供iphone和ipad看function video2mp4($src, $dst, $rate) {file_exists($dst.".mp4")[email protected]($dst.".mp4"):'';$cmd = $this->system_ffmpeg." -threads 4 -i ".$src." -r 29.97 -vcodec libx264 -flags +loop -cmp +chroma -deblockalpha 0 -crf 24 -bt ".$rate."k -refs 1 -coder 0 -subq 5 -partitions +parti4x4+parti8x8+partp8x8 -g 250 -keyint_min 25 -level 30 -qmin 10 -qmax 51 -trellis 2 -sc_threshold 40 -i_qfactor 0.71 -acodec libfaac -ab 128k -ar 48000 -f mp4 ".$dst.".mp4";//2>&1";$this->pr($cmd);$handle = @popen($cmd, 'r');while(!feof($handle)) {$line = fgets($handle, 1024);}@pclose($handle);$mp4identify = $this->getIdentify($dst.".mp4");$mp4le = abs($mp4identify['id_length']);if($mp4le>0) {$cmd = $this->system_qtfaststart." ".$dst.".mp4 ".$dst.".mp4-new"." 2>&1";$handle = @popen($cmd, 'r');while(!feof($handle)) {$line = fgets($handle, 1024);}@pclose($handle);$mp4identify = $this->getIdentify($dst.".mp4-new");$mp4le = abs($mp4identify['id_length']);if ($mp4le>0) {unlink($dst.".mp4");rename($dst.".mp4-new",$dst.".mp4");}}return true;}/** * grabImage 抓图-ok * * @param string $src 源文件 * @param string $dst 目标文件 * @param int $length 时长 * @param int $pic_count 截图数量 * @access public * @return void */function grabImage($src, $dst, $length,$pic_count) {$grabRes = $this->grabImageFfmpeg($src, $dst, $length,$pic_count); if (@!filesize($dst)) { return false; }return $grabRes;}/** * grabImageFfmpeg 通过ffmpeg抓图-ok * * @param string $src 源文件 * @param string $dst 目标文件 * @access public * @return void */function grabImageFfmpeg($src, $dst, $length,$pic_count) {//在视频中间截图$ss = $length/2;$cmd = $this->system_ffmpeg ." -y -i $src -vframes 1 -ss $ss -an -vcodec mjpeg -f rawvideo $dst 2>&1";$fd = @popen($cmd, 'r');while (!feof($fd)) {$line = fgets($fd, 1024);}@pclose($fd);$count = $pic_count+1;if ($length>$count) {$s = $length/$count;for ($i=1;$isystem_ffmpeg ." -y -i $src -vframes 1 -ss ".($i*$s)." -an -vcodec mjpeg -f rawvideo $dstpic 2>&1";$fd = @popen($cmd, 'r');while (!feof($fd)) {$line = fgets($fd, 1024);}fclose($fd);}}return true;}/*** resizeImage从一个已有图片建立一个新的图片-ok * @param string $src 源文件 * @param string $obj 目标文件 * @param string $width 目标文件宽 * @param string $height 目标文件高 * @access public*/function resizeImage($src, $obj, $width, $height) {list($width_orig, $height_orig, $type_orig) = getimagesize($src);if ($width && ($width_orig < $height_orig)) {$width = ($height / $height_orig) * $width_orig;} else {$height = ($width / $width_orig) * $height_orig;}switch($type_orig) {case 1: $image = imagecreatefromgif($src);break;case 2: $image = imagecreatefromjpeg($src);break;case 3: $image = imagecreatefrompng($src);break;default:return false;}$image_p = imagecreatetruecolor($width, $height);imagecopyresampled($image_p, $image, 0, 0, 0, 0, $width, $height, $width_orig, $height_orig);imagejpeg($image_p, $obj);return true;}/** * injectMetaData 向flv文件添加元数据-ok * 以支持播放器的拖放 * 返回flv时长 * @param string $file * @access public * @return init or false, if failed */function injectMetaData($file) {$info = array('code'=>false, 'msg'=>'未开始');//文件是否存在if (!file_exists($file)) {$info['msg'] = '文件不存在。';return $info;}$cmd = $this->system_yamdi . " -i $file -o ".$file."_ | grep lasttimestamp";$fd = @popen($cmd, 'r'); $lasttimestamp = 0;while (!feof($fd)) {$line = fgets($fd, 1024); if (strpos($line, ':')) { $lasttimestamp = substr($line, strpos($line, ':') + 1); }}pclose($fd);$l = $this->getIdentify($file.'_');if ($l['id_length']) {unlink($file);rename($file.'_',$file);}//Logger::trace(sprintf('lasttimestamp: %s', $lasttimestamp));//Logger::debug('Inject End');if ($lasttimestamp == '' || $lasttimestamp == 0){$lasttimestamp = $this->getIdentify($file);}return $lasttimestamp['id_length'];}function pr($msg) {echo "$msg\r\n

";}/** * getIdentify 获取视频信息-ok * @access public * @return void */function getIdentify($file) {$identify = array();if (!is_readable($file)) {return false;}$cmd = $this->system_mplayer . " -msglevel all=0 -identify -vc dummy -endpos 00:00:00 $file 2>&1";$fd = @popen($cmd, 'r');while (!feof($fd)) {$line = fgets($fd);if (strpos($line, 'ID_') === 0) {$line = explode('=', $line);$line[0] = strtolower($line[0]);$identify[$line[0]] = trim($line[1]);}}@pclose($fd);//假如mplayer没有获取到视频长度就用ffmpeg再次获取//视频长度$return = $identify['id_length'];if ($return == '' || !is_numeric($return)){//再次获取$cmd = $this->system_ffmpeg . " -i $file 2>&1";$fd = @popen($cmd, 'r');while (!feof($fd)) {$line = fgets($fd);$line = trim($line);$line = strtolower($line);if (strpos($line, 'duration:') === 0) {$line = explode(',', $line);$line = explode(':', $line[0]);$identify['id_length'] = abs($line[1])*3600+abs($line[2])*60+abs(((int)$line[3]));break;}}}return $identify;}function log($key, $value) {}}

?

相关文章

相关视频

php滑动换视频,php工具类之【视频变换类】相关推荐

  1. 使用高级视频质量工具 AVQT 评估视频 | WWDC 演讲实录

    本文根据 Pranav Sodhani 在 WWDC 2021<Evaluate videos with the Advanced Video Quality Tool >主题分享翻译.P ...

  2. 视频去水印工具-在线短视频去水印工具

    我们从一些大的视频平台下载视频都会带有平台水印.想要去除这些水印其实非常简单.今天就来教大家2款掉视频水印的方法.对于需要大量视频素材的朋友来说非常值得收藏,下面,跟着小编一起往下面看看! 一.水印云 ...

  3. android 视频剪辑工具,微剪辑视频剪辑工具

    微剪辑视频剪辑工具app是一款人人都能很快学会的安卓视频剪辑神器.微剪辑视频剪辑工具app拥有多种非常专业的商品剪辑功能,微剪辑视频剪辑工具还有众多的素材全都可以免费使用! 软件介绍 微剪辑视频剪辑工 ...

  4. 使用视频下载工具 you-get 下载视频

    最近需要帮我妈下载一些爱奇艺上的视频,找到了you-get这个下载神器 该工具的github主页 安装you-get 该工具是基于python的,因此需要先装python,版本需要python3.2以 ...

  5. ev1百家云视频解密工具、ev1视频提取工具,支持Windows、MacOS、Linux

    介绍: 根据你的系统进入相对应的文件夹 打开 终端 键入:ev1_decode 后面空格隔开键入 ev1文件路径 回车.转换将在瞬间完成 网盘下载地址: http://www.bytepan.net/ ...

  6. exe软件打包工具哪个好_小视频制作软件哪个好?推荐五款超赞小视频制作工具...

    我们每天都会刷很多小视频,你是否也想自己制作小视频?只要拥有一款视频制作利器,你也能快速做出获赞无数的小视频,本文给你介绍五款非常实用的,推荐一试! 小视频制作工具推荐 小视频制作工具推荐 蜜蜂剪辑 ...

  7. 全能视频转换工具:OmniConverter全能转换器 for Mac

    Omni Converter全能转换器是mac上一款超级好用的全能视频转换工具,支持视频转换,音频转换和视频压缩,而且操作简单,处理速度非常快速,而且支持输入输出多种格式,兼容性非常强!有兴趣的朋友可 ...

  8. 视频剪辑器都有哪些?分享几种操作简单的视频剪辑工具

    通过剪辑视频,可以将视频中的无用镜头和重复内容去掉,使得视频更加紧凑,节奏更加流畅,提高观看体验.在现今的快节奏社会,观众对于时间的精打细算,因此,视频的剪辑显得尤为重要.如果视频过于冗长,观众会感到 ...

  9. 视频编辑软件:迅捷视频工具箱

    这是一款功能强大.易于使用的视频编辑工具,支持视频剪辑.视频转换.音频转换.视频压缩.视频水印.字幕贴图等实用功能,可以帮助你制作出高质量的视频作品.(传送门:https://www.xunjiepd ...

  10. 优酷视频下载器 优酷视频下载方法

    iku爱酷V2.1版优酷视频加速器下载优酷视频下载器 iku爱酷V2.1版优酷视频加速器. 视频加速器播放速度更快!下载速度更快!旋风般的加速感觉! 视频下载看下载优酷站内视频,充分满足你的收藏欲. ...

最新文章

  1. ASP.net随机数应用实例
  2. asp开发中存储过程应用全接触 _asp技巧
  3. shutil常用语法
  4. 18寒假最后一测+dijistra模板
  5. 收集网络状态(Ping),并用邮件通知管理员
  6. WPF实现环(圆)形菜单
  7. 使用JavaScript中的示例编号MAX_VALUE属性
  8. 程序猿的数学:scratch篇
  9. C++设计模式之Singleton模式(单例模式)
  10. bzoj 1640 bzoj 1692: [Usaco2007 Dec]队列变换(后缀数组)
  11. Alpine linux硬盘安装
  12. win10屏幕保护色设置
  13. MIDAS GTS NX在高边坡工程中的应用
  14. BMC指定4路NCSI网口中的一路
  15. 用python做生日礼物_地产大佬潘石屹把学习Python当作生日礼物送给自己
  16. [面试] 面试官: 你还有什么想问我的?
  17. Shinobi开源监控项目安装
  18. 再见,x 雷!这款 Github 全能下载工具,太强了!
  19. CVE的提交与Github写入技巧
  20. OpenCV手势识别-手掌特征提取

热门文章

  1. [数据结构]-散列表(哈希表)
  2. python解决鸡兔同笼问题
  3. 【玩转server 2019系列】Windows server 2019打开windows defender提示“需要新应用打开windows defender”的解决方法
  4. Vue开发微信H5 微信分享签名失败问题解决方案
  5. 出现should be mapped with insert=“false“ update=“false“的解决方法
  6. 对于在git上面拉代码报“error: RPC failed; curl 56 OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 10054“解决方法
  7. 什么是Python 3相当于“python -m SimpleHTTPServer”
  8. 在JavaScript中生成随机字符串/字符
  9. 如何签出远程Git分支?
  10. golang设计模式之原型模式