在Zend Framework中开启Dojo时,报如下错误:
[php]
Fatal error: Uncaught exception ‘Zend_Loader_PluginLoader_Exception’ with message ‘Plugin by name ‘Dojo’ in E:\mydev\source\ZendFramework-1.12.3-minimal\library\Zend\Controller\Plugin\Broker.php on line 336
Zend_Loader_PluginLoader_Exception: Plugin by name ‘Dojo’ was not found in the registry; used paths: Zend_View_Helper_: Zend/View/Helper/;./views\helpers/ in E:\mydev\source\ZendFramework-1.12.3-minimal\library\Zend\Loader\PluginLoader.php on line 412
[/php]
经过多次尝试,终于找到原因。在Bootstrap中,本来是这样写的:
[php]
$view->addHelperPath(‘Zend/Dojo/View/Helper/’, ‘Zend_Dojo_View_Helper’);
Zend_Dojo::enableView($view);
// $viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper(‘ViewRenderer’);
// $viewRenderer->setView($view);
[/php]
错误就出在上面注释的两行代码,将其注释掉即可解决。
分类: PHP
ffmpeg转换时报错:flv does not support that sample及ffmpeg参数详解
ffmpeg.exe是一款视频转换工具,该工具有如下几大特点:
1、音频转换(ffmpeg -i my_audio.wav my_audio.mp3-i)
2、视频转换(ffmpeg -i my_video.mpeg -s 500×500 my_video.flv-i)
3、从视频中截取图片
4、从视频中采集音频
5、创建截屏视频
6、用图片制作视频
7、从webcam中截取视频
该工具运行在windows下dos系统,通过输入命令执行,支持avi,FLV,asf,mpeg,mp3等等格式,使用方法如下:开始菜单–运行–cmd—然后再运行ffmpeg软件,非常实用。
今天使用ffmpeg.exe转换视频时,出现一个问题,怎么也转换不成功,通过错误信息,看到提示是“flv does not support that sample rate, choose from (44100, 22050, 11025).Could not write header for output file #0 (incorrect codec parameters ?)”和“Sample rate must be 11025, 22050 or 44100
Error while opening codec for output stream #0.1 – maybe incorrect parameters such as bit_rate, rate, width or height”
我之前的写法是:
ffmpeg -i input.avi output.flv
我于是查了下相关资料,再通过多次测试,发现是语句上的写法出了点问题。
最后写成这样就没有问题了:
ffmpeg -i input.avi -ar 22050 output.flv
不过,这样的输出flv文件质量比较低,后来发现,如果加多一个参数-sameq的话,输出的视频质量会大大提高。
写法如下:
ffmpeg -i input.avi -sameq -ar 22050 output.flv
扩充知识
转换FLV格式的ffmpeg.exe 参数说明
ffmpeg.exe -i F:\input.mp3 -ab 56 -ar 22050 -b 500 -r 15 -s 320×240 f:\output.flv
ffmpeg -i F:\01.wmv -ab 56 -ar 22050 -b 500 -r 15 -s 320×240 f:\test.flv
使用-ss参数 作用(time_off set the start time offset),可以从指定时间点开始转换任务。如:
转换文件格式的同时抓缩微图:
ffmpeg -i “test.avi” -y -f image2 -ss 8 -t 0.001 -s 350×240 ‘test.jpg’
对已有flv抓图:
ffmpeg -i “test.flv” -y -f image2 -ss 8 -t 0.001 -s 350×240 ‘test.jpg’
-ss后跟的时间单位为秒
Ffmpeg转换命令
ffmpeg -y -i test.mpeg -bitexact -vcodec h263 -b 128 -r 15 -s 176×144 -acodec aac -ac 2 -ar 22500
-ab 24 -f 3gp test.3gp
或者
ffmpeg -y -i test.mpeg -ac 1 -acodec amr_nb -ar 8000 -s 176×144 -b 128 -r 15 test.3gp
ffmpeg参数设定解说
-bitexact 使用标准比特率
-vcodec xvid 使用xvid压缩
-s 320×240 指定分辨率
-r 29.97 桢速率(可以改,确认非标准桢率会导致音画不同步,所以只能设定为15或者29.97)
◆画面部分,选其一
-b <比特率> 指定压缩比特率,似乎ffmpeg是自动VBR的,指定了就大概是平均比特率,比如768,1500这样的就是原来默认项目中有的
-qscale <数值> 以<数值>质量为基础的VBR,取值0.01-255,约小质量越好
-qmin <数值> 设定最小质量,与-qmax(设定最大质量)共用,比如-qmin 10 -qmax 31
-sameq 使用和源同样的质量
◆声音部分
-acodec aac 设定声音编码
-ac <数值> 设定声道数,1就是单声道,2就是立体声,转换单声道的TVrip可以用1(节省一半容量),高品质的DVDrip就可以用2
-ar <采样率> 设定声音采样率,PSP只认24000
-ab <比特率> 设定声音比特率,前面-ac设为立体声时要以一半比特率来设置,比如192kbps的就设成96,转换均默认比特率都较小,要听到较高品质声音的话建议设到160kbps(80)以上
-vol <百分比> 设定音量,某些DVDrip的AC3轨音量极小,转换时可以用这个提高音量,比如200就是原来的2倍
这样,要得到一个高画质音质低容量的MP4的话,首先画面最好不要用固定比特率,而用VBR参数让程序自己去判断,而音质参数可以在原来的基础上提升一点,听起来要舒服很多,也不会太大,看情况调整。
例子:ffmpeg -y -i “1.avi” -title “Test” -vcodec xvid -s 368×208 -r 29.97 -b 1500 -acodec aac -ac 2 -ar 24000 -ab 128 -vol 200 -f psp -muxvb 768 “1.***”
解释:以上命令可以在Dos命令行中输入,也可以创建到批处理文件中运行。不过,前提是:要在ffmpeg所在的目录中执行(转换君所在目录下面的cores子目录)。
参数:
-y(覆盖输出文件,即如果1.***文件已经存在的话,不经提示就覆盖掉了)
-i “1.avi”(输入文件是和ffmpeg在同一目录下的1.avi文件,可以自己加路径,改名字)
-title “Test”(在PSP中显示的影片的标题)
-vcodec xvid(使用XVID编码压缩视频,不能改的)
-s 368×208(输出的分辨率为368×208,注意片源一定要是16:9的不然会变形)
-r 29.97(帧数,一般就用这个吧)
-b 1500(视频数据流量,用-b xxxx的指令则使用固定码率,数字随便改,1500以上没效果;还可以用动态码率如:-qscale 4和-qscale 6,4的质量比6高)
-acodec aac(音频编码用AAC)
-ac 2(声道数1或2)
-ar 24000(声音的采样频率,好像PSP只能支持24000Hz)
-ab 128(音频数据流量,一般选择32、64、96、128)
-vol 200(200%的音量,自己改)
-f psp(输出psp专用格式)
-muxvb 768(好像是给PSP机器识别的码率,一般选择384、512和768,我改成1500,PSP就说文件损坏了)
“1.***”(输出文件名,也可以加路径改文件名)
机器强劲的话,可以多开几个批处理文件,让它们并行处理。
E:\ffmpeg.exe -i I:\1.wmv -b 360 -r 25 -s 320×240 -hq -deinterlace -ab 56 -ar 22050 -ac 1 D:\2.flv
PHP利用Ffmpeg进行视频转码(视频格式转换)
Google下载一个Ffmpeg
得到文件
下载好之后首先就是配置一下环境变量
我下载的放在了D盘跟目录
D:\oracle\product\10.2.0\client_1\bin;D:\oracle\product\10.2.0\db_1\bin;%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;C:\Program Files\Java\jdk1.7.0\bin;C:\Program Files\ATI Technologies\ATI.ACE\Core-Static;C:\Program Files\Common Files\Thunder Network\KanKan\Codecs;D:\Program Files\TortoiseSVN\bin;C:\Program Files\Microsoft SQL Server\90\Tools\binn\;D:\ffmpeg
配的有点多,最后那个就是我的ffmpeg
配置好之后就先在Dos中测试下
打开Dos界面 输入 ffmpeg
如果成功的话会显示好多的命令
如果失败则显示 你输入的不是内部命令之类的。
如果失败就看看自己的环境变量是否配置OK
OK之后先在Dos下测试是否能成功转换
首先在一个目录放入一个视频
我在D盘跟目录放入了Demo.avi 视频,我将要转换为Flv
输入命令:ffmpeg -i D:/Demo.avi D:/Demo..flv
-i 后面紧跟的是要转换的文件地址 在后是你要把文件转换到哪里以及相对应的文件名和格式
输入命令之后回车,看看相对应的目录是否出现了你需要的转换后的文件。
如果失败检查命令是否错误。
PHP中执行转换的命令
[php]
//转换为Flv
function makeFlv($video_file,$flv_file)
{
//判断给定的文件是否正常
if(!is_file($video_file)){
return false;
}
global $flv_msg;
$flv_cmd=”ffmpeg -i “.$video_file.” “.$flv_file;
exec($flv_cmd,$flv_msg);
}
//创建flv视频的图片
function makeFlvPic($flv_file,$flv_pic_file)
{
global $flv_msg;
$flv_pic_cmd=”ffmpeg -i “.$flv_file.
” -y -f image2 “.
” -ss 1 “.
” -t 0.001 “.
” -s 350×240 “.$flv_pic_file;
exec($flv_pic_cmd,$flv_msg);
}
[/php]
PHP循环检测目录是否存在并创建(循环创建目录)
[php]
/*
* 功能:循环检测并创建文件夹
* 参数:$path 文件夹路径
* 返回:无
*/
private function createDir($path){
if (!file_exists($path)){
$this->createDir(dirname($path));
mkdir($path);
}
}
[/php]
PHP上传文件推荐命名规则
通常上传文件时,都会对文件进行重命名,如果命名规则不够合理,很可能出现文件命名出现冲突的问题。
我总结了两种重命名的方法:
1、md5加密
计算上传文件md5,以这个md5作为文件名称。这种方式出现重名,并且重名的文件是不一样的的几率由md5出现碰撞的几率决定。
使用md5重新命名的方法,有一个好处,就是上传同样的文件,服务器只会保存一份,不会浪费空间。这个方法的缺点也是比较明显的,就是md5名称看起来不是很友好,而且md5如果出现碰撞,就会导致数据丢失。现在md5的碰撞也逐渐被找到。有兴趣的童靴可以自行研究下。
2、以日期方式重命名
我个人比较喜欢这种方法,但是如果精确到秒的话,名称重复的可能性就非常高了,所以通常要精确到微秒。形如下面的格式:
[php]
2012 09 20 17 21 55 927386 . jpg
年 月 日 时 分 秒 微秒 后缀
[/php]
因为每个目录下的文件数量是有限制的,所以还要细分目录进行存储,我常用年月日来分目录,就是每天上传的文件保存到一个目录。把上面的格式稍微改一下,改成下面的格式:
[php]
2012/09/20/ 17 21 55 927386 . jpg
年/月/日/ 时 分 秒 微秒 后缀
[/php]
在正式保存文件时要循环检验要保存的地址是否已经存在文件了,如果文件已经存在,就要重新命名,直到文件不存在为止。
通过试验可以发现,date函数并不支持“微秒”的输出,总是输出“00000”。下面给出一个支持微秒的时间输出函数。
[php]
/*
* 功能:支持微秒的时间输出函数
* 参数:$format 时间格式
* 返回:无
*/
private function udate($format = ‘u’, $utimestamp = null) {
if (is_null($utimestamp))
$utimestamp = microtime(true);
$timestamp = floor($utimestamp);
$milliseconds = round(($utimestamp – $timestamp) * 1000000);
return date(preg_replace(‘`(?< !\\\\)u`', $milliseconds, $format), $timestamp); } [/php]
Zend Framework如何使Action不使用View进行输出
有时会碰到不需要使用View视图进行输出,那么我们只需要在相应Action的最后禁用View输出就可以了。
在Action的末尾加入以下代码:
[php]
// 不再输出view
$this->_helper->viewRenderer->setNoRender();
[/php]
Zend Framework中Zend_Form浅析
Zend_Form组件的使用容易出现VC(View,Controller)的强耦合,这实在是个大问题,下面举例说明应该怎样合理使用Zend_Form:
假设我们要实现一个用户登陆的表单,其代码大致情况如下:
控制器:
[php]
$form = new Zend_Form;
$form->setMethod(‘post’);
$username = new Zend_Form_Element_Text(‘username’);
$username->setLabel(‘Username’)->setRequired(true)->addValidator(‘NotEmpty’);
$password = new Zend_Form_Element_Password(‘password’);
$password->setLabel(‘Password’)->setRequired(true)->addValidator(‘NotEmpty’);
$submit = new Zend_Form_Element_Submit(‘submit’);
$form->addElements(array($username, $password, $submit));
$form->clearDecorators();
$form->addDecorator(‘FormElements’)
->addDecorator(‘HtmlTag’, array(‘tag’ => ‘ul’))
->addDecorator(‘Form’);
$form->setElementDecorators(array(
array(‘ViewHelper’),
array(‘Errors’),
array(‘Description’),
array(‘Label’, array(‘separator’=>’ ‘)),
array(‘HtmlTag’, array(‘tag’ => ‘li’, ‘class’=>’element-group’)),
));
$submit->setDecorators(array(
array(‘ViewHelper’),
array(‘Description’),
array(‘HtmlTag’, array(‘tag’ => ‘li’, ‘class’=>’submit-group’)),
));
if ($this->_request->isPost()) {
if ($form->isValid($this->_request->getPost())) {
// success …
} else {
$form->populate($this->_request->getPost());
}
}
$this->view->form = $form;
[/php]
视图:
[php]
echo $this->form;
[/php]
这是Zend_Form最一般的用法,从这个典型的例子中我们能很容易的发现表单的渲染是在控制器中完成的,从理论上来说,类似Label,Decorator(如上红色部分)这样的代码本质上属于视图的范畴,不应该出现在控制器中,而且,视图需求向来是复杂多变的,很难在控制器里处理。幸运的是,Zend_Form有一个Zend_Form_Decorator_ViewScript方案,可以比较完美的解决这些问题:
修改后的代码如下:
控制器:
[php]
$form = new Zend_Form;
$form->setMethod(‘post’);
$username = new Zend_Form_Element_Text(‘username’);
$username->setRequired(true)->addValidator(‘NotEmpty’);
$password = new Zend_Form_Element_Password(‘password’);
$password->setRequired(true)->addValidator(‘NotEmpty’);
$submit = new Zend_Form_Element_Submit(‘submit’);
$form->addElements(array($username, $password, $submit));
if ($this->_request->isPost()) {
if ($form->isValid($this->_request->getPost())) {
// success …
} else {
$form->populate($this->_request->getPost());
}
}
$this->view->form = $form;
[/php]
视图:
[php]
echo $this->form->setDecorators(array(
array(‘ViewScript’, array(‘viewScript’ => ‘/path/to/viewscript.phtml’))
))->render();
[/php]
viewscript.phtml:
[html]
[/html]
可以看到,通过使用ViewScript,在不影响现有功能的情况下,我们将表现逻辑相关代码完整的剥离了出来,当然,这里还有一些细节可以改进,比如说控制器中的Form代码可以集中写在一个Form类中,还有表单的生成可以结合使用Zend_View_Helper_Form*相关助手等等。
分享到:
PHP利用CURL模拟登陆并获取数据
[php]
< ?php
$cookie_file = tempnam('./temp','cookie');
$login_url = 'http://renrenstudy.com/login.php'; // 此处设置登录表单提交指向的action
$post_fields = 'username=test&password=123'; // 表单项
$ch = curl_init($login_url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_fields);
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file);
curl_exec($ch);
curl_close($ch);
$url='http://renrenstudy.com/account.php'; // 欲获取的页面地址
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file);
$contents = curl_exec($ch);
echo $contents;
curl_close($ch);
?>
[/php]
Zend Framework如何在application.ini配置mysql数据库连接
[php]
[production]
#PHP错误是否显示,您所在时区,bootstrap引导文件配置(1为true,0为false)
phpSettings.error_reporting = 8191
phpSettings.DATE.timezone = “Asia/Shanghai”
phpSettings.display_startup_errors =1
phpSettings.display_errors =1
bootstrap.path = APPLICATION_PATH”/Bootstrap.php”
bootstrap.class = “Bootstrap” #这个名称请对应到上面Bootstrap.php文件中的类
#项目载入的模块,插件,错误提示信息配置
resources.FrontController.moduleDirectory = APPLICATION_PATH”/modules”
resources.FrontController.moduleControllerDirectoryName = “controllers”
resources.FrontController.defaultModule = “default”
resources.FrontController.plugins.common = “Custom_Controller_Plugin_Layout”
resources.FrontController.noErrorHandler = 1
resources.FrontController.throwExceptions = 1
#resources.FrontController.noViewRenderer = false
#网站页面标题,编码以及ViewHelper的设置(这些可有可无.我们可以在不同的模块中设置不同)
resources.view.title = “Kylingood”
resources.view.encoding = “UTF-8”
resources.view.helperPathPrefix = “Custom_View_Helper_”
resources.view.helperPath = “Custom/View/Helper/”
#网站前台模块(不同模块对应不同layout,与不同的ViewHelper)
resources.view.params.DEFAULT.basePath = APPLICATION_PATH”/modules/default/views/”
resources.view.params.DEFAULT.helperPathPrefix =”Custom_View_Helper_Default_”
resources.view.params.DEFAULT.helperPath = “Custom/View/Helper/Default/”
resources.view.params.DEFAULT.layout = “default”
resources.view.params.DEFAULT.layoutPath = APPLICATION_PATH”/modules/default/views/layouts”
#用户后台模块(同上)
resources.view.params.user.basePath = APPLICATION_PATH”/modules/user/views/”
resources.view.params.user.helperPathPrefix = “Custom_View_Helper_User_”
resources.view.params.user.helperPath = “Custom/View/Helper/User/”
resources.view.params.user.layout = “default”
resources.view.params.user.layoutPath = APPLICATION_PATH”/modules/user/views/layouts”
#您数据库的配置参数
resources.db.adapter = PDO_MYSQL
resources.db.params.host = “localhost”
resources.db.params.username = “root”
resources.db.params.password = “uniono”
resources.db.params.dbname = “blog”
resources.db.params.prefix = “oophp_”
resources.db.isDefaultTableAdapter = TRUE
resources.db.params.driver_options.1002 = “SET NAMES UTF8;”
#网站多语言配置(前期学习可以不管,甚至于去掉)
resources.translate.registry_key = “Zend_Translate”
resources.translate.adapter = array
resources.translate.options.scan = “directory”
resources.translate.locale = “zh_CN”
resources.translate.data.zh_CN = APPLICATION_PATH”/languages/zh_CN.php”
resources.translate.data.en_US = APPLICATION_PATH”/languages/en_US.php”
#网站生成的日志(前期学习可以不管,甚至于去掉)
[logger]
priority = 7
file = “log/debug.txt”
;EMERG=0;ALERT=1;CRIT=2;ERR=3;WARN=4;NOTICE=5;INFO=6;DEBUG=7;
type = firebug
;stream,firebug
#网站生成Cache配置(前期学习可以不管,甚至于去掉)
[cache]
type = file
dir = APPLICATION_PATH”/cache/”
pagedir = APPLICATION_PATH”/cache/page/”
lifetime = 7200
automatic_serialization = TRUE
[/php]
Zend Framework 富文本编辑器 | 在线编辑器
在最近的一个项目中,用了百度推出的在线富文本编辑器,感觉蛮好用的。推荐一下。
Zend Framework插入当前时间报错 | ORA-01861: 文字与格式字符串不匹配
无法插入当前时间。
错误提示:ORA-01861: 文字与格式字符串不匹配
解决办法:
[php]
$data = array(
‘ID’ => time(),
‘TITLE’ => $newyqgg->getTitle(),
‘CONTENT’ => $newyqgg->getContent(),
‘AUTOR’ => $newyqgg->getAutor(),
‘CREATETIME’ => new Zend_Db_Expr(“sysdate”), // 此处使用Zend_Db_Expr
‘STATUS’ => $newyqgg->getStatus(),
‘BZ’ => $newyqgg->getBz()
);
[/php]
ZendFramework部署项目 | 如何使用ZF tools
zf create project myzf 将创建一个新的ZF工程.
zf create action add index 在index controller 中创建一个add action
Zend_Tool for windows:
1、在C盘下面创建一个新的目录zendframework,如c:/zendframework
2、从网上下载ZendFramework-1.8.0-minimal.zip,然后解压就会出来一个bin文件夹和一个library文件夹,把这两个文件夹拷贝到c:/zendframework中。
3、把c:/zendframework/bin添加到环境变量中,右击“我的电脑”=>“属性”=>“高级”=>“环境变量”,双击path,然后把c:/zendframework/bin添加进去。完成。
Zend_Tool for OS X (Linux is similar)
• Extract the downloaded archive file, ZendFramework-1.8.0b1-minimal.zip in your Downloads
directory by double clicking on it.
• Copy to /usr/local/ZendFrameworkCli by opening Terminal and typing:
sudo cp -r ~/Downloads/ZendFramework-1.8.0-minimal /usr/local/
ZendFrameworkCli
• Edit your bash profile to provide an alias:
• From Terminal, type: open ~/.bash_profile
• Add alias zf=/usr/local/ZendFrameworkCli/bin/zf.sh to the end of the file
• Save and exit TextEdit.
• Exit Terminal.
在bin目录中有两个文件:zf.bat和zf.sh,zf.bat是在windows中运行的,另一个是在linux中运行的。
测试一下,进入命令行,输入:zf show version
它将显示Zend Framework Version: 1.8.0
zf create project myzf 将创建一个新的ZF工程.
zf create action add index 在index controller 中创建一个add action
其它的详细信息请参考:http://framework.zend.com/manual/en/zend.tool.framework.html