LINUX下配置FFMPEG模块完成视屏截图功能(续2)

一条评论

2011 年 10 月 29 日 at 下午 1:19分类:Linux | PHP

如果在安装ffmpeg-php的时候出现了如下错误:
1:如果在make 中发现错误提示:make: *** [ffmpeg_frame.lo] Error 1
那么需要把解压出来的ffmpeg-php的文件夹中的ffmpeg_frame.loT文件名该层ffmpeg_frame.lo
命令:mv ffmpeg_frame.loT ffmpeg_frame.lo

2:如果有ffmepg-php模块错误提示:php: symbol lookup error: /usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/ffmpeg.so: undefined symbol: register_ffmpeg_frame_class
那么就需要修改ffmpeg_frame.c,将3处的PIX_FMT_RGBA32 更改为PIX_FMT_RGB32即可。
#vi ffmpeg_frame.c
#:%s/PIX_FMT_RGBA32/PIX_FMT_RGB32
#:wq!

修改完错误之后需要重新编译安装
#/usr/local/php/bin/phpize clear
#/usr/local/php/bin/phpize
#./configure –with-php-config=/usr/local/webserver/php/bin/php-config
#make test
#make
#make install

如果一路走下来,没有报错。但是你在用php插件进行视频截图的时候,总是不成功,那么这个时候,你就要考虑一下几个问题了:
1:文件目录是否可写;2:php的gd哭是否支持jpeg或者是png(我之前就是由于之前的php没有安装jpeg,所以吃了大苦头)

VMware安装Linux,出现错误-未找到要在其中创建新文件系统的有效设备

一条评论

2011 年 10 月 18 日 at 上午 10:15分类:Linux

问题:
VMware里安装CentOS5.5 Linux时出现:出现错误-未找到要在其中创建新文件系统的有效设备。请检查您的硬件以找到问题的起因。
原因:
VM默认硬盘是SCSI硬盘(安装VMware安装的时候选择Custom安装是可以选择),而SCSI硬盘需要专门的驱动,windows系统带有,而read hat没有,所以会出现未找到要在其中创建新文件系统的有效设备的错误提示。

解决方法:
把原来的scsi硬盘删除,新建一个IDE硬盘,就可以了
在Favorites(虚拟机)单击你要处理的计算机–>Edit vitual machine settings(设置)––>单击 “Hard Disk (SCSI 0:0)”(硬盘)–>在这个框下边有一个”Remove(移除)”,单击这个就是删除了。–>单击”Remove”左边的”Add…(添加)”,下一步,”Hard Disk”(硬盘),Create a new vitual disk(创建一个新的虚拟硬盘),下一步,选择IDE,然后下一步就可以了.

IT界人士常光顾的WEB站点

一条评论

2011 年 10 月 14 日 at 下午 1:06分类:乱七八糟

1、Chinaunix
网址:http://www.chinaunix.net
简介:中国最大的linux/unix技术社区。

2、ITPub
网址:http://www.itpub.net
简介:有名气的IT技术论坛,看看它的alexa排名就知道有多火了,尤其以数据库技术讨论热烈而闻名。ITPUB论坛的前身是建立在smiling的oracle小组。

3、51cto
网址:http://www.51cto.com
简介:由国内知名IT门户网站管理团队,获近千万风险投资,于2005年8月正式创立,是国内首家定位于网络技术人员的综合性服务平台,是中国最大的网络技术网站。

4、CSDN
网址:http://www.csdn.net
简介:于1999年3月成立,是中国最大的软件开发人员网站,社区热心高手众多,并有不少MVP(微软最有价值专家)长期活跃在这里,类似悬赏的积分制度,也使论坛增添不少乐趣。

5、落伍者
网址:http://www.im286.com/
简介:网站站长都应该知道的地方,只是论坛id需要手工审核。

6、蓝色理想
网址:http://www.blueidea.com/
简介:有名的关于网站设计的网站,拥有大量忠实网友。

7、IT写作社区
网址:http://www.donews.com/
简介:一个可以让你的思维活跃起来的地方,在这里it评论人和撰稿人可以找到很多的文字素材。

8、
博客堂
网址:http://blog.joycode.com/
简介:众多MVP交流的地方,这里有各类最新技术,只是网站成员采用邀请制,不提供注册或者申请功能。

9、IT英雄榜
网址:http://www.itheroes.cn/
简介:网站以介绍it界人士为主,广大从事it的人员可以从中获取他们的经验。

10、邪恶八进制
网址:http://www.eviloctal.com/
简介:目前为数不多的一个讨论气氛浓厚,技术水平高的网络安全网站,邪恶八进制信息安全团队也是一个管理规范、人员素质高的网络安全小组。

php设计模式之建造者模式

没有评论

2011 年 10 月 12 日 at 下午 10:58分类:PHP

本人文笔功能有限,详细看代码,代码不是很难。
下面是建造者模式的一个经典例子:

 <?php
 /**
  * 建造者模式
  * 将一个复杂对象的构建与它的表示分离,使用同样的构建过程可以创建不同的表示
  */
class Product
{
    public $_type = null;
    public $_size = null;
    public $_color = null;
 
    public function setType($type)
    {
        echo "set product type<br/>";
        $this->_type = $type;
    }
 
    public function setSize($size)
    {
        echo "set product size<br/>";
        $this->_size = $size;
    }
 
    public function setColor($color)
    {
        echo "set product color<br/>";
        $this->_color = $color;
    }
}
$config = array(
    "type"=>"shirt",
    "size"=>"xl",
    "color"=>"red",
);
// 没有使用bulider以前的处理
$oProduct = new Product();
$oProduct->setType($config['type']);
$oProduct->setSize($config['size']);
$oProduct->setColor($config['color']); 
 
// 创建一个builder类
class ProductBuilder
{
    var $_config = null;
    var $_object = null;

    public function ProductBuilder($config)
    {
        $this->_object = new Product();
        $this->_config = $config;
    }

    public function build()
    {
        echo "--- in builder---<br/>";
        $this->_object->setType($this->_config['type']);
        $this->_object->setSize($this->_config['size']);
        $this->_object->setColor($this->_config['color']);
    }

    public function getProduct()
    {
        return $this->_object;
    }
}
 
$objBuilder = new ProductBuilder($config);
$objBuilder->build();
$objProduct = $objBuilder->getProduct();

制作密保卡功能

没有评论

2011 年 10 月 11 日 at 下午 11:50分类:PHP

功能如题:
效果如图:
代码如下:

<?php
header("Content-Type: text/html; charset=UTF-8");
//生成大写字母
function rand_str($i){
    $str = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    $finalStr = array();
    for($j=0;$j<$i;$j++) {    
        $strTemp = substr($str,rand(0,strlen($str)-1),1);
        $finalStrArray[$j] = $strTemp;
        $str = str_replace($strTemp, "", $str);
    } 
    sort($finalStrArray);
    $arrstr = $finalStrArray;
    $$strstr="";
    for($h=0;$h<$i;$h++){
    	$strstr .= $arrstr[$h];
    }
    return $strstr;
}

//生成数字
function rand_num($num){
	$array   =   array(0,1,2,3,4,5,6,7,8,9);   
	$key   =   array_rand($array,$num);   
	$str   =   "";   
	for($i=0;$i <$num;$i++){
		$str .=$array[$key[$i]];
	} 	
	return $str;
}

//生成随机横坐标
$rand_str = rand_str(10);
$arr   = array();
for($k=0;$k<strlen($rand_str);$k++){
	for ($i = 1;$i < 9;$i++){
		$rand = rand_num(3);
		//赋给所有code的容器
		$arr[$rand_str{$k} . $i] =  $rand;
	}
}

$code   = serialize($arr); //序列化后将信息入库
$letter   = $rand_str;

function show(){
	global $code,$letter;
		$codes = unserialize($code);
		//图片初始值
		$bit = 3;  //密保卡位数
		$height = 332;    //图片高度
		$width =  626;    //图片宽度
		$im = imagecreatetruecolor($width,$height);
		$linecolor = imagecolorallocate($im, 229,229,229);
		$fontcolor = imagecolorallocate($im, 0, 0, 0);
		$top_rectangle_color = imagecolorallocate($im,241,254,237);
		$top_letter_color = imagecolorallocate($im,54,126,76);
		$left_rectangle_color = imagecolorallocate($im,243,247,255);
		$left_num_color = imagecolorallocate($im,4,68,192);
		$logo_str_color = imagecolorallocate($im,0,0,0);
		imagefill($im,0,0,imagecolorallocate($im,255,255,255));  //图片背景色
		$font    = 'arial.ttf';  //字体
		$font_en = 'candarab.ttf'; //英文字体
		$font2   = 'simhei.ttf'; //密保卡上方黑体
		//$dst = imagecreatefromjpeg("13135703499487.jpg");

		//imagecopymerge($im,$dst,120,15,0,0,193,55,100);
		imageline($im,10,72,$width-10,72,$linecolor);
		$ltext = "电子密保卡";

		if(!imagettftext($im,10,0,270,47,$logo_str_color,$font2,$ltext)) {
			exit('error');
		}

		//写入卡号
		$b = '1000'.rand_num(10);
		for($i=0;$i<7;$i++){
			$p.= substr($b,3*$i,4). ' ';
		}

		$x = 40; $y = 95; //序列号位置
		imagettftext($im,10,0,$x,$y,$color,$font2,'序列号:');
		imagettftext($im,11,0,$x+50,$y,$color,$font_en,$p);
		//颜色框
		imagefilledrectangle($im,10,106,$width-10,128,$top_rectangle_color);
		imagefilledrectangle($im,10,129,65,$height-10,$left_rectangle_color);
		//写入最上排英文字母及竖线
		for($i=1;$i<=10;$i++){
			$x = $i*55+35;     
			 $y = 123;   
			  $float_size = 11;   //字母位置参数
			imagettftext($im,$float_size,0,$x,$y,$top_letter_color,$font_en,$letter{$i-1});//写入最上排英文字母
		}

		for($i=0;$i<=9;$i++){

			$linex = $i*55+65;    $liney = 105;    $liney2 = $height-10;  //竖线位置参数

			imageline($im,$linex,$liney,$linex,$liney2,$linecolor);//划入竖线

		}



		//写入竖排数字及填入矩阵数据 划横线

		for($j=0;$j<8;$j++){

			$jj=$j+1;

			$x=35;  $y=($jj*24)+123; //左排数字及横线位置参数

			imagettftext($im, $float_size, 0, $x, $y, $left_num_color, $font_en, $jj);//写入左排数字

			for($i=1;$i<=10;$i++){

				$float_size2=11;  $x = $i*55+27;  $sy=$y;  //填入矩阵数据位置参数

				$s = $letter{$i-1};
				$s .= $j + 1;
				imagettftext($im,$float_size2,0,$x,$sy,$fontcolor,$font_en,$codes[$s]);//写入矩阵数据

			}
		}

		for($j=0;$j<10;$j++){

			$line_x=10; $line_x2=$width-10;$y=$j*24+105; //横线位置参数 y坐标数据同上

			imageline($im,$line_x,$y,$line_x2,$y,$linecolor);//划入横线

		}

		//外框边线

		imageline($im,10,10,$width-10,10,$linecolor);//横线

		//imageline($im,10,$height-10,$width-10,$height-10,$linecolor);

		imageline($im,10,10,10,$height-10,$linecolor);//竖线

		imageline($im,$width-10,10,$width-10,$height-10,$linecolor);

		//生成图片

		ob_clean();
		header("Content-type: image/jpeg");
		imagejpeg($im,null,100);
		imagedestroy($im);
	}
show();

?>

注意其中的字体路径换成自己的字体路径
密保卡验证:

       $codes = unserialize($codes); 
        $is_true = true; 
        foreach($_SESSION['mibao']['keys'] as $key) 
        { 
            if($codes[$key] != $_POST['values'][$key]) 
            { 
                $is_true = false; 
            } 
        } 
         
        if($is_true) 
        {            
            die('正确'); 
        } 
        else  
        { 
             
            die('错误'); 
        } 

就这么简单。

linux下配置ffmpeg模块完成视屏截图功能(续)

没有评论

2011 年 10 月 11 日 at 下午 12:49分类:PHP

补充上次讲的那个php插件ffmpeg的安装失败问题。
linux命令:

cd /usr/local/src
wget http://garr.dl.sourceforge.net/sourceforge/ffmpeg-php/ffmpeg-php-0.6.0.tbz2
tar jxvf ffmpeg-php-0.6.0.tbz2
cd ffmpeg-php-0.6.0
phpize//这里可以不用加完整路径
./configure//这里后面可以不用加配置文件的路径
make
make install

这些步骤和之前的基本上时差不多的。唯一的不一样的地方在于需要修改些插件的某个文件:
在解压完成之后
我们进入如下目录:

cd /usr/local/src/ffmpeg-php-0.6.0

然后把ffmpeg_frame.c这个文件换成下面这个文件:
点击下载
然后在执行phpize以下的代码。
之后的过程和上次的讲的是一样的,包括添加.so的拓展和重启Apache等。

jQuery布局插件 Masonry 的使用

没有评论

2011 年 10 月 11 日 at 上午 12:09分类:jQuery

详细文件地址:http://masonry.desandro.com/jquery.masonry.min.js

使用方法及效果:

http://www.oschina.net/p/masonry?from=rss;

http://masonry.desandro.com/demos/basic-single-column.html

php插件机制原理

2条评论

2011 年 10 月 10 日 at 下午 11:54分类:PHP

插件很多从事互联网行业或者开发的人员来不是很陌生,wordpress之所以为什么那么受欢迎,很大部分是因为他的强大的插件库,还要譬如就是大家熟知的jquery,他的插件丰富的让人难以想象。一个开源产品想要获得很好的用户首先要具有搞扩展性,插件就是一种。插件,亦即Plug-in,是指一类特定的功能模块(通常由第三方开发者实现)。
它的特点是:当你需要它的时候激活它,不需要它的时候禁用/删除它;且无论是激活还是禁用都不影响系统核心模块的运行,也就是说插件是一种非侵入式的模块化设计,实现了核心程序与插件程序的松散耦合。
在php的插件中,很大一部分的插件都与一个叫:call_user_func_array的php函数有很大的关系,
当然php的插件机制的实现不仅仅是这一种方法。关于此函数的运用,请去看手册吧。
一个插件需要三个条件:
1、插件的支持函数,进行插件的功能实现
2、插件的Hook点,我们称为钩子埋入点,就是在什么地方这个插件要执行。
3、插件的位置

第一步:支持函数:
我们新建函数文件function.php,代码如下:

<?php
/*
* 在插件列表中要添加的插件名
* @ pragma string $hook 插件列表名
* @ pragma string $actionFunc 插件名
*/
function addAction($hook, $actionFunc){
	global $emHooks;
	if (!@in_array($actionFunc, $emHooks[$hook])){
		$emHooks[$hook][] = $actionFunc;
	}
	return true;
}
/**
 * 插件钩子的执行函数。也就是所谓的钩子的埋入点函数
 * @param string $hook  插件列表名
 */
function doAction($hook){
	global $emHooks;
	$args = array_slice(func_get_args(), 1);//获取其他参数
	if (isset($emHooks[$hook])){
		foreach ($emHooks[$hook] as $function){
			$string = call_user_func_array($function, $args);
		}
	}
}

第二步:设置钩子埋入点:

define("APP_ROOT",str_replace("\\","/",dirname(__FILE__))."/");
require("function.php"); //加载功能函数
/**
* 加载插件路径
* 一般情况下,我们要先存储和判断插件是否激活,
*你可以保存在数据库中,也可以保存在文件配置缓存中
*/
function load_plugins_file($plugin) {
        //要判断和检查。
	if(is_string($plugin) && preg_match("/^[\w\-\/]+$/", $plugin) && file_exists(APP_ROOT."plugins/".$plugin.".php")){
		require APP_ROOT."plugins/".$plugin.".php";
	}
}
//演示的插件例子
$pluginsName = array("check_all","login");
foreach($pluginsName as $plugin){
	load_plugins_file($plugin);
}
//埋下的钩子
doAction("fbbin");

第三步:插件代码实现
我们按照上面定义的两个插件名字建立check_all.php和login.php两个文件,然后在check_all.php文件中写入:

<?php
function check_all() {
	echo "<p>全部通过</p>";
}
addAction("fbbin","check_all");//像fbbin插件列表中添加插件,那么之后执行的doAction函数就能在全局变量中找到这个插件了,那么这样子,这个插件便会被执行。
?>

同理在login.php文件中,可以写入相关的内容 然后在后面加上addAction(“fbbin”,”login”);那么login插件就会被执行了。

linux下配置ffmpeg模块完成视屏截图功能

没有评论

2011 年 10 月 10 日 at 下午 8:25分类:Linux | PHP

如果能够联网的情况下:
首先需要安装php的运行环境
一:更新yum:

yum -y update

二:. 用yum安装Apache,Mysql,PHP.
2.1安装Apache

yum install httpd httpd-devel

安装完成后,用

/etc/init.d/httpd start 

启动apache
设为开机启动:

chkconfig httpd on

2.2安装mysql

yum install mysql mysql-server mysql-devel

同样,完成后,用

/etc/init.d/mysqld start 

启动mysql
2.2.2 设置mysql密码
mysql>; USE mysql;
mysql>; UPDATE user SET Password=PASSWORD(‘newpassword’) WHERE user=’root’;
mysql>; FLUSH PRIVILEGES;
2.2.3 允许远程登录

mysql -u root -p
Enter Password: <your new password>
mysql>GRANT ALL PRIVILEGES ON *.* TO ‘用户名‘@’%’ IDENTIFIED BY ‘密码’ WITH GRANT OPTION;

2.2.4 设为开机启动

chkconfig mysqld on

2.3. 安装php

yum install php php-mysql php-common php-gd php-mbstring php-mcrypt php-devel php-xml
/etc/init.d/httpd start

这样子环境搭建完毕。
//======================================================================
a:安装编译环境,这一步可以省略:

#yum install -y automake autoconf libtool gcc gcc-c++[code]
b:安装所需程序库的RPM包到centos:[code]
rpm -Uhv http://apt.sw.be/redhat/el5/en/i386/rpmforge/RPMS/rpmforge-release-0.3.6-1.el5.rf.i386.rpm

c:安装ffmpeg模块:

yum -y install ffmpeg ffmpeg-devel

到这里为止php的ffmpeg模块安装完毕。
//=====================================================================
安装ffmpeg模块的php插件FFMPEG-PHP(由于版本问题,没有测试通过),这个插件可以不用安装,至于为什么,后面再说。

cd /usr/local/src 
wget http://garr.dl.sourceforge.net/sourceforge/ffmpeg-php/ffmpeg-php-0.6.0.tbz2 
tar jxvf ffmpeg-php-0.6.0.tbz2 
cd ffmpeg-php-0.6.0 
/usr/local/php/bin/phpize 
./configure --with-php-config=/usr/local/php/bin/php-config#此处为你的php-config文件所在的目录
make 
make install

在php.ini文件加上这句
extension=ffmpeg.so

然后重新启动apache

/etc/init.d/httpd restart

如果以上步骤都是正确通过的话,那么你用phpinfo就应该可以看到ffmpeg这个插件了。我这边由于版本上面的问题,没有正确的走下来,这个没有关系。
因为我们在linux上面的ffmpeg的模块式安装成功的,那么我们只要使用ffmpeg这个命令也就可以执行了,同时我们在php中,也可以使用exec函数和system函数来执行一个linux命令,所以上面女的插件安装不成功也是可以正常操作的,只是如果安装成功了,那我们只要直接调用插件就可以了,而不用使用exec函数和system函数。
以下使用命令测试的几个例子:
1:截取一张352x240尺寸大小的,格式为jpg的图片:

 
ffmpeg -i fbbin.flv -y -f image2 -t 0.001 -s 352x240 a.jpg

2:在视频的第80秒处截取 320*240 的缩略图

ffmpeg -i test.flv -y -f mjpeg -ss 80 -t 0.001 -s 320x240 test.jpg

其中例子2是针对flv格式的视频获得指定处的缩略图,记住 -f强制转换的格式是mjpeg因为我要获得.jpg的缩略图,网上有很多写成文章都是写成ffmpeg -i test.flv -y -f image2 -ss 08.010 -t 0.001 -s 352x240 b.jpg 这个是错误,不可能输出.
下面是用php代码来实现的一个例子:

<?php
//此例子正常运行无误!
$flvName = "fbbin.flv";

$imgName = time().'.jpg';

exec("/usr/bin/ffmpeg -i /var/www/html/". $flvName ." -y -f mjpeg -ss 10 -s 350*240  /var/www/html/" . $imgName,$out,$status);

print_r($status);//0是成功 1是失败

关于ffmpeg的参数使用这里就不再说明,网上很多。
//////////////////////////////////////////////////////////////////////////////
上面讲的式在联网的情况下,那么要是在不能联网的情况下呢,如下操作:
1:首先我们需要事先下载好ffmpeg模块的压缩包
地址:http://download.chinaunix.net/down.php?id=5532&ResourceID=2990&site=1;
2:解压压缩包:

tar xvfj ffmpeg-0.4.9-p20051120.tar.bz2

得到解压后的目录是ffmpeg-0.4.9-p20051120,名字太长,利用mv命令改为ffmpeg

mv ffmpeg-0.4.9-p20051120.tar.bz2 ffmpeg

3:配置选项:

cd ffmpeg
./configure --enable-shared --prefix=/usr/local/ffmpeg

其中:--enable-shared 是允许其编译产生动态库,在以后的编程中要用到这个几个动态库。--prefix设置的安装目录。
4:编译并安装

make && make install

5:安装之后在/usr/local/ffmpeg会看到有三个目录
  lib 动态链接库位置
  include 编程要用到头文件
  bin 执行文件所在的目录
6:我们把lib中的三个链接库libavcodec.so libavformat.so libavutil.so复制到/usr/lib下。把include目录下的ffmpeg目录复制到/usr/include下。不然在运行时会报错的。
这样子ffmpeg模块安装完毕。
同理,你要是想安装php的ffmpeg插件,采取上面同样的方法。
例子:

<?php

$flvName = "fbbin.flv";

$imgName = time().'.jpg';

exec("/usr/local/ffmpeg/bin/ffmpeg -i /var/www/html/". $flvName ." -y -f mjpeg -ss 10 -s 350*240  /var/www/html/" . $imgName,$out,$status);

print_r($status);//0是成功 1是失败

如果图片没有获取成功,可能的原因有:
1:对于存储生成图片的文件夹需要有写入权限 #chomd 777 /var/www/html/
2:在php.ini中有disable_functions禁用了php调用shell命令函数,
解决办法:注释掉disable_functions这一项
#disable_functions = proc_open, popen,exec, system, shell_exec, passthru
或者disable_functions = (把禁言的函数除去)

3:php.ini中的安全模式必须关闭 才可以调用exec函数
safe_mode = off
4:图片时间截取也很重要,很有可能是无效图片或者是黑屏

资料参考:
http://www.jb51.net/article/28301.htm;
http://www.linuxdiyf.com/viewarticle.php?id=104214