一个FFMPEG视频转换的PHP类

来源:互联网 发布:淘宝怎么设置7天上下架 编辑:程序博客网 时间:2024/06/16 21:37

<?phpclass local_video{    public $options;    public $ffmpeg;    public $phpcms_path;    public $backup;    function __construct($options,$ffmpeg,$backup=true)    {        $this->options=pc_base::load_config('convert');        $this->options = array_filter($options) + $this->options;        $this->ffmpeg=$ffmpeg;//ffmpeg路径        $this->backup=$backup;    }    //获取视频信息    function video_info($file)    {        ob_start();        passthru(sprintf($this->ffmpeg . ' -i "%s" 2>&1', $file));//ffmpeg -i test.avi 2>&1        $info = ob_get_contents();        ob_end_clean();        // 通过使用输出缓冲,获取到ffmpeg所有输出的内容。        $ret  = array();        // Duration: 01:24:12.73, start: 0.000000, bitrate: 456 kb/s        if (preg_match("/Duration: (.*?), start: (.*?), bitrate: (\d*) kb\/s/",$info, $match))        {            $ret['duration'] = $match[1]; // 提取出播放时间            $da              = explode(':', $match[1]);            $ret['seconds']  = $da[0] * 3600 + $da[1] * 60 + $da[2]; // 转换为秒            $ret['start']    = $match[2]; // 开始时间            $ret['bitrate']  = $match[3]; // bitrate 码率 单位 kb        }        // Stream #0.1: Video: rv40, yuv420p, 512x384, 355 kb/s, 12.05 fps, 12 tbr, 1k tbn, 12 tbc        if (preg_match("/Video: (.*?), (.*?), (.*?)[,\s]/", $info, $match))        {            $ret['vcodec']     = $match[1]; // 编码格式            $ret['vformat']    = $match[2]; // 视频格式            $ret['resolution'] = $match[3]; // 分辨率            $a                 = explode('x', $match[3]);            $ret['width']      = $a[0];            $ret['height']     = $a[1];        }        // Stream #0.0: Audio: cook, 44100 Hz, stereo, s16, 96 kb/s        if (preg_match("/Audio: (\w*), (\d*) Hz/", $info, $match))        {            $ret['acodec']      = $match[1];       // 音频编码            $ret['asamplerate'] = $match[2];  // 音频采样频率        }        if (isset($ret['seconds']) && isset($ret['start']))        {            $ret['play_time'] = $ret['seconds'] + $ret['start']; // 实际播放时间        }        $ret['size'] = filesize($file); // 文件大小        return $ret;    }    function convert()    {        $verifyToken = md5('unique_salt' . $this->options['timestamp']);        if ($verifyToken == $this->options['token'])        {            $orgFile  = $this->options['org_path'] . $this->options['org'];            $setting=' ';            if(isset($this->options['video_size']))                $setting=$setting.'-vf scale="'.$this->options['video_size'].'"';            $mp4      = $this->ffmpeg . ' -i  '  . $orgFile . ' -ss 00:01:02 -vcodec libx264 -strict -2 '.$setting.' ' . $this->options['mp4_path_temp'] . $this->options['org'] . '';//转换视频            exec($mp4);            if(isset($this->options['watermark'])){            $watermark=' "'.$this->options['watermark'].'" ';            $mp4 = $this->ffmpeg.' -i '.$this->options['mp4_path_temp'] . $this->options['org'] . ''.' -vf '.$watermark.' '.$this->options['mp4_path'] . $this->options['org'] . '';//增加水印            exec($mp4);            @unlink($this->options['mp4_path_temp'] . $this->options['org'] . '');            }            $duration = $this->video_info($orgFile);            $seconds  = intval($duration['seconds']);            $offset   = intval($seconds / 21);//截图间隔 秒            $thumbs = explode(',', $this->options['thumb_size']);            for ($i = 0; $i <= count($thumbs); $i++)            {                $targetPath = $this->options['thumb_path'] . $this->options['org'] . '/';                if (!file_exists($targetPath))                    @mkdir(rtrim($targetPath, '/'), 0777);                if ($i == 0)                {                    $time     = 1;                    $name     = $i == 0 ? 'default.jpg' : $i . '.jpg';                    $img_size = $this->options['main_size'];                }                else                {                $time       = $i * $offset;                $name       = $i . '.jpg';                $img_size   = $thumbs[$i-1];                }                $jpg = $this->ffmpeg . ' -i  ' . $orgFile . ' -f  image2  -ss ' . $time . ' -vframes 1  -s ' . $img_size . ' ' . $targetPath . $name;//截图                @exec($jpg);            }            //复制文件到对应的FTP服务器            $ftp_server    = pc_base::load_config('ftp_server');            $remote_server = $_POST['remote_server'];            $ftp_server    = $ftp_server[$remote_server];            if($ftp_server['ftp_server'])                pc_base::ftp_upload($orgFile,                                $ftp_server['ftp_server'],                                $ftp_server['ftp_user_name'],                                $ftp_server['ftp_user_pass']);            //备份到所有FTP服务器            if($this->backup){                $ftp_backup = pc_base::load_config('ftp_backup');                foreach ($ftp_backup as $v)                {                    pc_base::ftp_upload( $orgFile,                                        $ftp_backup['ftp_server'],                                        $ftp_backup['ftp_user_name'],                                        $ftp_backup['ftp_user_pass']);                }            }            $result['url']=$ftp_server['ftp_server']['http_address']. $this->options['mp4_path'] . $this->options['uniqid'] . '.mp4';//记录视频播放地址            $result['uniqid']=$this->options['uniqid'];            $result['videoTime'] = $this->video_info($orgFile);            $result['videoTime'] = $result['videoTime']['seconds'];            return $result;//返回处理结果        }        else            die('验证失败!');    }}?>


参考

http://www.fieryrain.com/blog/FFMPEG_VIDEO_TIME

http://keren.iteye.com/blog/1773536

http://www.cnblogs.com/dwdxdy/p/3240167.html

http://www.cnblogs.com/chen1987lei/archive/2010/12/03/1895242.html

0 0
原创粉丝点击