抓取视频信息的函数

因为写了一个相册系统,所以发现这个问题,这年头谁还只是傻傻的照相啊,肯定是外带拍N多的视频啦。好吧,代码再改改,添加上传视频的功能。

只是说起来简单,做起来啰嗦。这视频不如照片信息的格式统一,不过还好,基本上应付市面上机器拍摄的视频信息提取函数也大概写出来了。

注意:这是基于FFMpeg的,所以不管是Windows还是Linux都是安装FFMpeg才行。

function getVideoInfo($path){
    $fileNameArray = explode('.',$path);
    $ext = strtolower($fileNameArray[count($fileNameArray)-1]);

    ob_start();
    passthru(sprintf('ffmpeg -i "%s" 2>&1',$path));
    $info = ob_get_contents();
    ob_end_clean();
    $data = [];
    switch ($ext) {
        case 'mov':
            if(preg_match("/com.apple.quicktime.make:(.*)/",$info,$res)) $data['Make'] = $res[1];
            if(preg_match("/creation_time   :(.*)/",$info,$res)){
                $date = strtotime(str_replace('/',' ',trim($res[1])));
                $data['date'] = date('Y-m-d H:i:s',$date);
            }
            // if(preg_match("/com.apple.quicktime.creationdate:(.*)/",$info,$res)) $data['Date'] = date('Y-m-d H:i:s',strtotime($res[1]));
            if(preg_match("/com.apple.quicktime.model:(.*)/",$info,$res)) $data['Model'] = $res[1];
            if(preg_match("/com.apple.quicktime.location.ISO6709:(.*)/",$info,$res)){
                $local = explode('+',$res[1]);
                $data['latitude'] = $local[2];
                $data['longitude'] = $local[1];
            }
            if (preg_match("/Duration: (.*?), start: (.*?), bitrate: (\d*) kb\/s/", $info, $res)){
                $data['duration'] = $res[1];
                $data['bitrate'] = $res[3].'kb/s';
            }
            break;
        case 'avi':
            if(preg_match("/encoder         :(.*)/",$info,$res)){
                $data['make'] = explode(' ',trim($res[1]))[0];
                $data['model'] = explode(' ',trim($res[1]))[1];
            }
            if(preg_match("/creation_time   :(.*)/",$info,$res)){
                $date = strtotime(str_replace('/',' ',trim($res[1])));
                $data['date'] = date('Y-m-d H:i:s',$date);
            }
            if (preg_match("/Duration: (.*?), start: (.*?), bitrate: (\d*) kb\/s/", $info, $res)){
                $data['duration'] = $res[1];
                $data['bitrate'] = $res[3].'kb/s';
            }
            break;
        case 'mp4':
            if(preg_match("/creation_time   :(.*)/",$info,$res)){
                $date = strtotime(str_replace('/',' ',trim($res[1])));
                $data['date'] = date('Y-m-d H:i:s',$date);
            }
            if(preg_match("/location        :(.*)/",$info,$res)){
                $local = explode('+',$res[1]);
                $data['latitude'] = $local[2];
                $data['longitude'] = $local[1];
            }
            if (preg_match("/Duration: (.*?), start: (.*?), bitrate: (\d*) kb\/s/", $info, $res)){
                $data['duration'] = $res[1];
                $data['bitrate'] = $res[3].'kb/s';
            }
        case '3gp':
            if(preg_match("/creation_time   :(.*)/",$info,$res)){
                $date = strtotime(str_replace('/',' ',trim($res[1])));
                $data['date'] = date('Y-m-d H:i:s',$date);
            }
            if(preg_match("/location        :(.*)/",$info,$res)){
                $local = explode('+',$res[1]);
                $data['latitude'] = $local[2];
                $data['longitude'] = $local[1];
            }
            if (preg_match("/Duration: (.*?), start: (.*?), bitrate: (\d*) kb\/s/", $info, $res)){
                $data['duration'] = $res[1];
                $data['bitrate'] = $res[3].'kb/s';
            }
            break;
        default:
            if(preg_match("/creation_time   :(.*)/",$info,$res)){
                $date = strtotime(str_replace('/',' ',trim($res[1])));
                $data['date'] = date('Y-m-d H:i:s',$date);
            }
            if(preg_match("/location        :(.*)/",$info,$res)){
                $local = explode('+',$res[1]);
                $data['latitude'] = $local[2];
                $data['longitude'] = $local[1];
            }
            if (preg_match("/Duration: (.*?), start: (.*?), bitrate: (\d*) kb\/s/", $info, $res)){
                $data['duration'] = $res[1];
                $data['bitrate'] = $res[3].'kb/s';
            }
            break;
    }
    return $data;


}

郁闷之中写了一个基于NAS的个人相册系统

前段时间以来都挺郁闷的,包括了现在。

在陷于郁闷当中的时候,突然看到了一条关于网易相册关闭的新闻。当时也没留意,关了就关了吧,反正我的照片都用本地硬盘装着,平时都是不通电搁在柜子里。想来网易也有一点以前传过的照片,好像在零六零七年的样子,那只是极少的部分。后来嫌麻烦,也就没传了,只是家里人要走了我的账号。

直到有一天,姐夫说起了不能传照片了,这才直到他们一直都在往里面放照片。于是乎,赶紧告诉他们网易相册要关门的消息,另外帮忙把所有的照片都打包了下来。还好打包及时,所有照片都Down下来了,只是发现好多原始照片都遗失,这是因为家人在上传的时候因为不懂选择了缩小图片,导致上面的照片都是几百乘几百像素的,并且丢失了照片原始时间地址等信息。

望着一个优盘,应该给谁呢?里面装的都是十多年来家人共同往上传的照片,再买优盘分配可最后分享也还是不方便。

在家人的埋怨网易中,是时候发挥码农的功用了,不就是个相册吗?对于一个码农来说,那也是个事?So Easy!

首先规划整个系统,存放照片,而且放的都是原文件,空间需求是极大的,为此干脆把空间安置在了家里的NAS里,有四个4T硬盘做了Raid5阵列,一定程度保障数据的安全,基本不用担心。为了随时随地访问,做了一个基于12V的UPS,用的是摩托车电瓶,电路自己焊,基于这里是讲软件系统就不描述了。对外访问有点麻烦,因为没有对外服务的端口,这个大家都懂,所以得改,我换成了8端口。不想麻烦也可以使用反向代理,但那得有还有个开放80端口的服务器,代理软件可以用frp。反正我是决定麻烦一下算了,因为代理也代表着数据得中转,这是影响速度的事情。另外简单了,就是还得有一个域名,如果有服务器,可以是国际域名,没有服务器也可以使用免费的二级域名。

然后,就是码代码了。拿的轮子有:ThinkPHP、Bootstrap、jQuery、FileInput、PhotoSwipe、Masonry、BootstrapValidator,前端两个页面,一个相册列表页一个相册页也就是照片列表页,数据库一共六个表,相册表、相片表、星星表、标签表、关联表、用户表,后台方法也简单,基本上就是增删改查。

好了,一顿乱炒,新鲜出炉!下载地址:magic