2009-03-31

过程生成与无限星辰这个游戏

  最近无限星辰(Infinity)这个游戏又放出了新的截图,用GPU来进行它的过程生成运算,使得行星的表面有一次有了质的飞跃。
  我们先看看这个游戏的自我介绍:

  Infinity: The Quest for Earth(译名:《无限星辰:失落的地球》)是一个基于未来宇宙背景的大型多人在线游戏,目前还在紧张开发中。

  这款游戏采用了一种先进的过程生成引擎。它会使玩家在宇宙中的探索看似无限大,而其中拥有着一颗颗独立的星球,同时在每颗星球上都可以做到无缝着陆。游戏将会给新老玩家提供一个宏大的故事背景,在宇宙中错综复杂的政治下,充斥着各种社会集团、公司和其他组织,而主线,将围绕游戏中的三大势力——人马座集团、德尔塔联邦和斯塔弗同盟之间的斗争展开。

通过使用I-Novae引擎先进的过程生成技术,《无限星辰》已经打破了往日游戏在固定空间内探索束缚。它将使动态生成数不清的星系与星球成为可能,每个独一无二的角落都在等待着发现它的人。通过绘制合理的天文距离与比例,每个在宇宙中不停运动天体轨道都会被精确地计算出来。在这里,从一睹遥远的双星系星球上两个太阳的日出,到观看一个距离你所在家园外千万光年的小月亮的月全食,都将成为可能。每一组景色,每一条地平线,在《无限星辰》世界里,都完全会是独一无二的。


  怎么样?听起来不错吧?网游就应该是这样个样子才对。
它的主页:http://www.infinity-game.com/infinity/index.php


  那么,这篇文章的主要目的还是通过这个游戏引入一种概念的介绍:Procedural Generation,这里被翻译作过程生成,其实理解就是在实际游戏的过程中生成游戏中相应的对象,这个游戏号称拥有的数十亿棵星球,每颗都有着有很多细节的地表。而这每颗星球的详细内容都是玩家在自己的机器上开启游戏后生成的。怎么样?神奇吧?
  其实,要理解这个过程生成技术必须要从它的数学原理下手,那就是分形,这里有一篇介绍这一思想的文章:递归之美:数学,电脑科学与分形 ,转自:http://mmdays.wordpress.com/2007/05/24/recursive/




monalisa-recursion想像一下,我剛才說了一句話,那句話是:「想像一下,我剛才說了一句話,那句話是:「想像一下,我剛才說了一句話,那句話是:……….」」,如此下去,就好像站在兩面平行擺設的鏡子中間,鏡子中的影像不斷的重複。再舉個例子,寫完一封信想要匿名保密,就署名「知名不具」。回信的人寫:「知 知名不具 具」。之後再回信的時候就變成:知知知名不具具具,加上括號可能比較清楚:(知(知(知名不具)具)具)。


遞迴就是類似這樣子,不斷的重複同樣的東西,只不過每次重複的是比較小的東西了。大家應該對數學歸納法不陌生,在使用數學歸納法時,我們首先確定 n=1 的時候某件事情是成立,然後在證明 n 到 n+1 的過程是正確的,就可以從 n=1 的例子,一路推論出第 n 項是甚麼東西。就像是推骨牌一樣,把第一張牌推倒了之後,剩下的骨牌自然就被前面的骨牌給推倒。



遞迴的概念則是相反的方向:我們想要解決一個大小為 n 的問題,我首先做的事情是把問題化簡成大小為 n-1 的問題,但是解決的方法還是一樣,只不過大小是 n-1。如此繼續化簡,最後變成大小為 n=1 的基本問題,接著只要n=1的基本問題解決了,原來大小為n的問題也跟著解決了。


這又好像層層分工。假設每個人都會加法,然後今天我想求出 1+2+…+n 等於多少?其中一個辦法就是遞迴,我先假設 1+2+…+(n-1) 已經有人算好,那麼我只要再加上 n,就可以得到答案了。然而 1+2+…+(n-1) 要怎麼得到呢?我就請另外一位朋友幫我算。另外一位朋友接到這個問題以後,也用同樣的方法,他把 1+2+…+(n-2) 的結果交給另外一位朋友算,然後把這個結果加上 (n-1),就變成我想要的 1+2+…+(n-1) 了。朋友的朋友也繼續用類似的方法,直到最後一位朋友只需要回答1,接著倒數第二位朋友就把1加上2,傳給倒數第三位朋友,倒數第三位朋友加上3,一直到我收到 1+2+…+(n-1) 的結果,再加上 n,就大功告成了。


recursion


不過可能會覺得,如此簡單的問題,為何還需要遞迴呢?其實遞迴也是比較適合一些問題來解,也就是那些「解決方式一樣,但是可以化成大小比較小」的問題,除此之外還可以輕鬆解決基本問題(n=1的時候)。舉例來說,有個古老的問題叫做河內塔 (Hanoi Tower),問題的定義引述如下 (引述網站)


haoi-tower1883年,一位法國的數學家 Edouard Lucas 教授在歐洲的一份雜誌上介紹了一個相當吸引人的難題──迷人的智力遊戲。這個遊戲名為河內塔 (Tower of Hanoi),它源自古印度神廟中的一段故事 (也有一說是 Lucas 教授為增加此遊戲之神秘色彩而捏造的)。傳說在古老的印度,有一座神廟,據說它是宇宙的中心。在廟宇中放置了一塊上面插有三根長木釘的木板,在其中的一根木釘上,從上至下被放置了64片直徑由小至大的圓環形金屬片。古印度教的天神指示祂的僧侶們將64片的金屬片移至三根木釘中的其中一根上。規定在每次的移動中,只能搬移一片金屬片,並且在過程中必須保持金屬片由上至下是直徑由小至大的次序,也就是說不論在那一根木釘上,圓環形的金屬片都是直徑較小的被放在上層。直到有一天,僧侶們能將64片的金屬片依規則從指定的木釘上全部移動至另一根木釘上,那麼,世界末日即隨之來到,世間的一切終將被毀滅,萬物都將至極樂世界。


倘若這個故事的敘述為真,那麼,我們只需加速移動金屬片,是不是就能愈早到達極樂世界呢?果真要移動這64片金屬片,那麼,至少要花幾次的搬動才能完成呢?有沒有規律可循呢?


這個問題,就很符合剛才的特性:我們可以把大問題化成小問題,而且解決的方法相同,只不過問題的大小變小了。另外基本問題(n=1),就是移動一根金屬片所需要的次數,這個我們也可以輕易解決,所以這個問題就可以用遞迴來解。


首先,我們假設有A、B、C三根柱子,這64片金屬片一開始在柱子A上面,我們想要搬到柱子C。因為問題中規定某個金屬片上面是空的時候才能移動,我們就假設有個人可以幫我們把63片比較小的金屬片先從柱子A搬到柱子B上面,然後我們把最大的那一片從柱子A搬到柱子C,再請那位朋友把剛才的63片從柱子B搬到柱子C,整個問題就解決了。然後我們只要知道剛才那位朋友搬了幾次,然後加上我們自己般動的1次,就是整個問題要求的搬動次數了。


遞迴不僅僅在數學上有其重要性,在電腦科學之中扮演的角色更是至關重要。程式設計者對於遞迴絕對不會陌生,上面所舉的河內塔問題,實際上也是電腦科學的經典例子之一,是初學程式設計的人一定會學到的東西。遞迴的思維,常常可以讓程式設計者打造出簡潔的程式,讓繁冗的問題透過簡單的程式碼來解決 (例如 parser 的設計)。演算法上所講的 dynamic programming,就是遞迴思維在演算法的具體呈現。


fractal-broccoli遞迴同時也是碎形 (fractal) 這門大學問的基石,碎形是一種相當美妙的幾何圖案,就如同上面那一張蒙娜麗莎的圖一樣,圖中有圖,形中有形,且小的部分都是大的部分的縮影,我們就稱之為碎形。碎形本身的數學定義,實際上就包含了遞迴定義在裡面,我們甚至於可以說,碎形是遞迴在幾何學的一種具體呈現。但是碎形不僅僅是一種數學概念而已,在自然界中,有許許多多的地方都出現自然的碎形,讓人讚嘆遞迴原來就出現在我們的生活周圍。圖中的這棵花椰菜,就蘊含了遞迴的碎形圖案與於其中。碎形同時也在各個研究領域有著廣泛的應用,光是在電腦科學領域,就有人把碎形應用在影像和影片壓縮之上 (這不難想像,由於碎形這種以小見大的特性,我們可以用小的來表現大的,因此可以有壓縮的概念出現),在電腦圖學上 (computer graphics),也有人把碎形應用在設計電腦遊戲之中的一些景物,打造出有效率和簡潔的系統。現在電腦遊戲之中的景物,很多都是玩家邊玩、遊戲系統邊產生出即時的景物,這叫做 procedural generation,這種即時產生景物的技術,可以避免遊戲軟體預先儲存一堆要展現的景物,幫整個軟體瘦身。procedural generation 就使用了大量的碎形產生與合成技術於其中,而這些都根植於遞迴這一個深刻卻簡單的思維。


至於把碎形應用在遊戲之中,現在已經做到有多可怕的地步了呢?請大家看看以下的三張圖片,不妨猜猜擁有這種精緻畫面的遊戲軟體,其整個遊戲的size大小是多少呢?


kkrieger-screenshot2 kkrieger-screenshot3 kkrieger-screenshot1


正確答案是97KB!沒錯,我沒有打錯字,你的眼睛也沒有看錯,這款遊戲的大小只有 97KB!傳統的一片 3.5 吋磁片可以裝下十幾個這款遊戲!這一款第一人稱的射擊遊戲叫做 .kkrieger,是由德國的 demogroup .theprodukkt 所開發,截至目前為止還在beta測試版的階段,這款遊戲之所以可以壓縮到這麼小的境界,就是因為遊戲之中的場景和音樂幾乎全部都是由動態產生,遊戲之中預先存放的資料只有一些簡單的幾何形狀和 MIDI 音樂檔,所以自然檔案大小非常小。如果這款遊戲沒有用 procedural generation 的技巧進來的話,估計檔案大小會爆增成 200~300MB,這樣的技術,真是令人嘆為觀止。而背後最大的功臣,就是這篇文章談到的遞迴和碎形。各位也不妨下載來玩玩看吧 (下載點)。不過需要注意到一件事情,這款遊戲的載入時間非常長,因為他要靠著一點點的程式碼即時來運算製造出場景,所以要耗去很多計算時間,這可說是一種 time 和 space 的 tradeoff。


看完這篇文章,各位有沒有對看似枯燥的數學有了一點點不同的看法呢?沒想到遞迴可以這樣應用在遊戲開發之中吧。下次學習數學感覺到枯燥時,不妨從應用的角度切入試試看吧!




过程生成简述
  过程生成的定义可以在维基上找到:

  http://en.wikipedia.org/wiki/Procedural_generation
  

  但是呢,不要把过程生成仅仅看作游戏编程里的概念。 过程生成的理念具有深远意义,比如它可以取代人类来自动的处理一些重复性的智能工作。 更加有趣的情况是,通过将自动性与一系列过程代码的集成,人们完全可以做到曾经不可想象的事情。比如最近无敌的作品《孢子》http://en.wikipedia.org/wiki/Spore_%28game%29

一下是infinity论坛的一群人关于此群聊的内容:

Freeman:
看上去“过程生成”在游戏中占很重要的地位!怎么去理解它?有没有专业解答?诚挚谢意!
Magellanic:
没有专业解答,我相信之前我给出过基本介绍.
首先,Infinity项目负责人(IA)将其描述为:
“过程生成”是一种让电脑实时或按要求的生成宇宙的技术,而不是预先制作好。因此,创造出的宇宙理所当然很大很大。数以万亿的世界,等待着冒险者们的探索,然而大多数可能永远不会被发现。
我理解为,这是一个电脑程序,它会用数学算法创造一个多变的宇宙。我相信这多变性叫做“seeds”。(译:seed?gundan
seed?我就不翻了)不同的输入会得出不同的结果。如果你十分不熟悉数学,那我就用一个简单的代数方程来解释。
5 + x = y
如果 x = 1,
那么 y = 6 如果 x = 5, 那么 y= 10
对于每一个x值,都对应着一个不同的y值,由此会得出许许多多结果。我是在ICP测试中知道的。用这个理念,我们可以创造各不相同的世界,因为我们输入了不同的数据。
而且,因为公式是不变的,只要输入相同的“seed”,就会得出相同的结果。所以,宇宙的物理参数不需要存储在你的电脑里,系统保留其特有的属性,都依赖于“seed”。
但我不是个程序员。只是个普通的玩家。如果你要更多的信息,等开IA回答吧,或用google,原谅我可能给出的错误信息。


Delver:
Hi
Freeman.我对数学不是很在行。这很伤脑筋。
我想你肯定会中文。(译:haha,被看穿了)
我不能用英语简单的叙述,我试试吧。
一个程序是一个可以用来做任何事的数学公式。像是画一个圆或三角。它同样可以用来解决复杂的问题。作出树,行星或更复杂的东西。你可以让程序记住东西将会是什么样子。现在如果你有真正复杂的事,你就会想这一定很难。用数学就可以使其更简单。电脑要做很多工作,但它确实比人工制作星球,城市简单的多。
我可以用很长时间用图画软件Photoshop或3dstudio去画一张看上去很像地球图。者要很长时间。
除了做这些,如果确实太复杂,我可以用一系列的程序来创建一个球体,然后填充如岛屿,水,空气...我怎么做呢?可以给每一样物品编上号。我可以把红色描述为数字FF0000(16进制),我可以将树描述为数字,涂上绿色0000FF。
我如果正确使用这些数字画出一个星球,我就可以做出一个同样的。如果我记得画这个星球的数字,我就可以告诉你,你也可以做出一个相同的。
简而言之:
程序是一个储存或创建数字来创造东西的数学公式或告诉你这东西是什么。你可以想像成制作东西的便宜法门。如果数字相同,公式相同,我们创造的东西也永远相同。如果我改变一点,创造出来的东西就完全不同了。

Freeman:
感谢你们Magellanic &
Delver。感谢你们现身说法。

DeAdLy_cOoKiE:
我觉得“过程生成”是在一个大空间下,所有事物都是由程序产生的.许多老套的(译:应该是old school,我讨厌学习不认真的)演示都用“过程生成”创造物体来炫耀,因为(cause,再次bs)电脑的内存在当时十分有限。当然也有用它做游戏的(特别是地图),midwinter, liberation等等。你可以通过变更参数来得出完美的效果。

Delver:
freeman,你最好再多找点资料。看看fractals(分形),这是最早的“过程生成”的图形演示。这超过我的能力了。
除了这些问题,有时我觉得这技术在未来会越来越重要。我的假设在我上个帖子写过了。什么会被刻画?什么会被创造?想象一下整个宇宙都可以随机产生!

terra0nova:
呃,“过程生成”不会储存任何数据,这正是其美丽之处,数据可能会放在内存里,但不会在硬盘上(当然要在内存里暂存,但产生出来的行星数据,不会储存,程序会决定行星的位置)给出坐标,程序(关于坐标的算法,像是伪随机算法,把坐标作为seed[译:呵呵])就会产生出你需要的行星。行星信息可能会暂存在内存中,以防你再次来(节省时间),但你一关游戏,数据就被删除了,如果需要,将再次由程序产生数据。
最大的问题是算法的速度,如果我们要这游戏与现实时间同步(很可能你到之前,行星就已经产生好了),即使如此,这算法仍要更快更完美(可以先大致产生些数据[星球外廓],然后再慢慢填充细节[城市和地面细节])。我不知道这些算法的速度,但如果做得太花,速度就会慢下来。城市看上去很有趣,但我们想要更大,更科幻的。

CutterJohn:
想象一下:
假如这就是我们的过程引擎:

X = 2y
那么现在我就向在座各位解释一下我的这个微型过程引擎。
请看,如果让Y = 5 (也就是所谓的‘seed’)。
每个人都拿出计算器来算一下X是多少。都是10吧? 如果不是,去买个新的。。。
很明显,我的“过程”引擎是很简陋的,但依然是一个不错的类比。
其实所谓的“过程”就是一堆用来计算所需答案的神奇方程式组。而游戏里的每一个客户端都内嵌了相同的方程式组。那么在给定同一个“seed”的情况下,这组方程式(完全一致的,记住)将在每一台电脑上输出一模一样的结果。这就好比你们计算如上所示的那个微型引擎必然得出相同结果一样。


本段内容出自http://www.infinity-game.com/bbs/viewthread.php?tid=491

2009-03-28

MySQL基本使用

  虽然没爱,但是会用到的,所以呢,还是学习一下。这里已经表示你用mysql命令登录进了数据库的情况了。

命令
mysql> SELECT VERSION(), CURRENT_DATE;
这个基本可以说明问题了,mysql的命令都是以;结尾的,当然注意是半角的,而且不区分大小写。
而显示都是以这种形式出现的:

+---------------+--------------+
version() current_date
+---------------+--------------+
5.1.29-rc-log 2009-03-28
+---------------+--------------+
1 row in set (0.00 sec)


这里举例:

mysql> show databases;
+--------------------+
Database
+--------------------+
information_schema
joinus
mysql
subversiondatabase
test
+--------------------+
5 rows in set (0.00 sec)

这个命令显示了你的机器上有哪些数据库

mysql> use test;
Database changed

这个命令选择了test这个数据库

显然,作为一个提供数据存储服务的程序,我们需要分配用户和对应的数据库,这里我们新建一个用户以允许用户登录到mysql,并且控制它自己的数据库。
所以这个命令等同于新建用户的:

GRANT priv_type ON db_name.table_name TO user_name IDENTIFIED BY ‘password’[WITH GRANT OPTION]





其中,大写的单词都是语法中的关键字,小写的部分是需要用户来完成,其中:

priv_type 表示权限类型,比如 select 、 insert 、 create 等,详细的权限名称可以参考 user 表中 field 字段名称,去掉后缀“ _priv ”后就是实际的权限名称。如果要授予全部的权限,可以用“ all privileges ”来代替。

  • db_name 表示数据库名称,‘ * ’表示所有数据库
  • table_name 表示表的名称,‘ * ’表示所有表。
  • user_name 表示要创建的用户名称,注意这个名称由用户名和 host 两部分组成。
  • password 表示用户的密码,用明文表示,创建的时候会自动进行加密。
  • WITH GRANT OPTION 表示新用户可以将自己的权限授予其他用户,如果不写,默认不可以。

这里需要注意的是,如果单独赋予管理权限,则“ ON db_name.table_name ”字句中的“ db_name.table_name ”需要写为“ *.*” ,因为管理权限是和某个具体的数据库无关的。

下面,我们创建三个用户,一个是超级用户,授予它对所有数据库的所有表的所有权限;另外一个是普通用户,授予它对数据库 test1 中表 t1 的 select 、 update 、 insert 、 delete 权限,这种情况适用于大多数情况,因为我们出于对数据的安全性考虑,一般不会给用户设置为超级权限;第三个是需要执行文件操作的用户,需要授予 file 权限。

创建超级用户:

mysql> grant all privileges on *.* to user1@localhost identified by '123';

Query OK, 0 rows affected (0.04 sec)

创建普通用户:

mysql> grant select,update,insert,delete on test1.t1 to user2@localhost identified by '123';

Query OK, 0 rows affected (0.01 sec)

创建具有文件权限的用户:

mysql> grant file on *.* to user3@localhost identified by '123';

Query OK, 0 rows affected (0.01 sec)

上例中的用户 host 都设置为 localhost ,只允许本地连接,这个值被记录到 user 表中的 host 字段中, host 可以是以下设置:

A. 主机名或 IP 号,或“ localhost ”指出本地主机。

B. 使用通配符字符 “%” 和 “_” 。其中,“ % ”匹配任何主机名, 使 用 “_” 匹配任何单个字符。空 Host 值等价于“ % ”。它的含义与 LIKE 操作符的模式匹配操作相同。例如,“ % ”的 Host 值与所有主机名匹配,而“ %.mysql.com ”匹配 mysql.com 域的所有主机。



这里我新建了一个用户:

grant all privileges on test.* to testuser@localhost identified by '123456';

当我使用这个用户登上去并使用

mysql> show databases;
+--------------------+
Database
+--------------------+
information_schema
test
+--------------------+
2 rows in set (0.00 sec)

所以我只能看到我有权限的数据库。
不过这里有个有趣的地方是,只要管理员给用户指定一个数据库的权限,如果这个数据库不存在的话,用户登录上来后可以自己创建。
管理员分配了ireport数据库的权限:
grant all on ireport.* to 'ulysess'@'localhost'
比如我用testuser登录后
mysql> create database ireport;
Query OK, 1 row affected (0.00 sec)


关于用户权限,在mysql数据库中,是有一个叫做权限表的东西的,这个可以读这篇引用:



权限系统认证过程实际是通过 MySQL 内部的 6 个权限表来实现的,分别是: user 、 db 、 host 、 tables_priv 、 columns_priv 和 procs_priv ,它们都位于 MySQL 安装后的“ mysql ”数据库中,这些权限表的作用如下:

A. user 控制 “ 用户名 ” ( user )可以从哪一台 “ 主机名 ”(host) 访问 mysql ,该表包括全局权限的控制。例 如,如果 user 表授予用户 DELETE 权限, 那么此用户可以在服务器主机上删除任何数据库中的记录!换句话说, user 表权限是超级用户权限。只把 user 表的权限授予超级用户如服务器或数据库主管是明智的。对其他用户,应该把在 user 表中的权限设成 'N' 并且仅在特定数据库的基础上授权。

B. Db 规定哪个用户可以访问哪个数据库。权限列决定允许哪个操作。授予的数据库级别的权限适用于数据库和它的表。

C. Host 表与 db 表结合使用在一个较好层次上控制特定主机对数据库的访问权限。

D. tables_priv 和 columns_priv 表类似于 db 表,但是权限更加精细:它们在表和列级应用而非在数据库级。授予表级别的权限适用于表和所有它的列。授予列级别的权限只适用于专用列。

E. procs_priv 规定谁可以执行哪个存储过程。

其中, user 表最为重要,它控制着整个 MySQL 的全局权限。 user 中的列主要分为四个部分:用户列、权限列、安全列、资源控制列,其中,我们用的最多的是用户列和权限列,权限列又分为普通权限和管理权限。普通权限主要用 于数据表的操作,比如 select_priv 、 create_priv 等;而管理权限主要用来对数据库进行管理的操作,比如 process_priv 、 super_priv 等等,普通权限在其他权限表中都可能有记录,而管理权限只在 user 表中有记录。

当用户与 MySQL 进行权限认证时,权限表的存取过程如下:

A. 先从 user 表中的 host 、 user 和 password 三个字段中判断连接的 IP 、用户名和密码是否存在于表中,如果存在,则通过身份验证,否则拒绝连接。

B. 如果通过身份验证,则通过 user 、 db 、 host 、 tables_priv 、 columns_priv 、 procs_priv 这几个权限表得到对应的数据库权限并进行授权。




恩,适时锻炼,打完收工,暂时只需要用到这么多,先这样吧。。。

------------------------------------------------------------------------------------
更新:
  我等必然常用到的 Mysql的一个常用功能就是修改用户和密码,那么看看三种修改用户密码的方法:
  • 登录mysql后
    use mysql;
    UPDATE user SET password=PASSWORD("NEW_PASSWORD") WHERE user='USER_TO_BE_CHANGE';

      mysql> FLUSH PRIVILEGES;
  • 登录mysql后
    SET PASSWORD FOR hunte=PASSWORD('NEW_PASSWORD');
  • 在系统的命令行下
    mysqladmin -u root "old password" "new password"


----------------------------------------------------------------------------------
再次更新:
删除用户:
DELETE FROM user WHERE User="testuser" and Host="localhost";
删除数据库:
drop database testdatabase;

2009-03-26

[JavaFX]Introduce

  这个学期的一个项目需要写手机客户端,结果刚好现在机会不错,所以就学下JavaFX。



  首先需要下载开发用的工具,作为程序员我们需要JavaFX SDK,不过这个东西不好用,所以建议直接用Netbeans for JavaFX。另外还有个JavaFX Production Suite,这个东西会作为插件装进Photoshop或Illustrator,你可以直接用那两个东西弄成的图片生成JavaFX要用的东西。



JavaFX的框架是这样的:




实际上JavaFX用的是JavaFX Script的脚本。

从第一个Hello World程序开始了解一下情况:

使用Netbeans建立的一个JavaFX项目默认会有一个Main.fx的文件。内容是这样的:






package learning;

import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.text.Text;
import javafx.scene.text.Font;

Stage {
title: "Application title"
width: 250
height: 80
scene: Scene {
content: Text {
font : Font {
size : 16
}
x: 10, y: 30
content: "Application content"
}
}
}

所以呢,事实上也就是这么回事。
说明:
Stage是最顶部的容器窗口,用来显示所有可视的 JavaFX 对象。默认的实例变量 title、width 和 height 分别定义了出现在窗口顶部边框里的文本及其高度和宽度。场景变量定义了一个 Scene 对象文字(设置 JavaFX 对象所放置的区域)的实例。

Scene这个对象文字类似于一个表现应用程序图形内容的刻画草图。scene 实例变量包含一个用于保存 JavaFX 图形元素的 content 变量,并定义应用程序的图形内容。
必须注意的是,当你为content增加元素的时候,比如上面只有一个Text,你要再加其他的Text,这些元素必须要用[]框起来。

作为HelloWorld程序 sun官方给的教程已经很不错了,可以自己参考:
http://javafx.com/docs/gettingstarted/javafx/create-first-javafx-app.jsp

接下来是其他的学习资源,当然,只有英文的了:

2009-03-25

传说中的java coding convention on one page


相当有趣,毋需多言。图片说明一切。

2009-03-21

用ireport+jasperreport制作报表

  所谓报表其实就是把数据按照某种方式整合起来,用适当的形式展示出来的东西。所以它的两个基本要素就是数据和表现,前者基本就是在各种实验、调查中获得的啦,后者嘛,jasperreport是一种比较方便的实现的工具,当然还有其他的。
  用jasperreport制作一个report一般有如下四个步骤:

  1. Create a template
  2. Compile the template
  3. Fill report
  4. Export report
ok,说明一下,第一步,一般用jasperreport的gui程序ireport创建一个template,这个东西其实只是一个xml文件,不过话说回来,开放式文档标准之后,还有什么不能用xml呢?只是要长的漂亮大家才爱用就是。。。
第二步,编译其实就是把上步的那个xml文件编译成一个二进制文件,这个虽然可以不编译,不过因为模板很常用所以弄一下就一次编译多次使用咯。
第三步,这个其实应该要在第一步搞定,但是实际当弄好一个模板以后只需要从这一步开始,所以放到这里,如果是第一次制作这个模板,那么有两种方法fill,第一种是在要fill的地方直接写sql语句,第二中是创建一个自己的数据源,不过这种需要extent JRDataSource这个类。
第四步,看你的需求,可以导出成pdf,html等等很多很多种。


接下来以我的ireport 3.50来练习一个报表。
新装的ireport长这样的:

既然是quick start,也非常简单,我这里直接用Database JDBC Connection
设置好你的配置,连接测试成功就ok了。
如果你是一个新数据库的话,你得先在服务器端弄好你的表。
我的长这样:
mysql> show tables;
+-------------------+
| Tables_in_ireport |
+-------------------+
| testreport |
+-------------------+
1 row in set (0.00 sec)

mysql> describe testreport;
+--------------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------------+-------------+------+-----+---------+-------+
| title | varchar(40) | YES | | NULL | |
| author | varchar(30) | YES | | NULL | |
| isbn | varchar(30) | YES | | NULL | |
| pic | varchar(80) | YES | | NULL | |
| perchasedate | date | YES | | NULL | |
+--------------+-------------+------+-----+---------+-------+

然后用创建新report的quick start。
选定好以后那个数据库查询(Query)只需要select * from 你的表 即可,这里主要是ireport获得表字段。


至于之后的group是干什么的呢,一张图就说明问题了,我这里以title 和 perchasedate为两个group的报表效果:

我这里录入了两条数据,其实就是图书的一些资料。当然这个报表的模板是默认的,相当的丑。

不过新版本有一个好的地方就是,早期的各种问题,诸如中文字体,和其他很多乱七八糟的问题都已经被解决了。

Jasperreport + ireport环境的配置

  最近才知道很多人用jasperreport和ireport来做报表,其实前者使用xml定义报表的模板,能够已多种格式输出成各种报表,后者只是前者的一个gui而已(但是ireport现在的版本其实是基于netbeans的),因为懒得玩window的,所以我直接就在我的ubuntu上来构建这个环境了,这篇帖子只说如何部署,所以没有概念定义。
  首先准备好东西:
  ireport:
https://sourceforge.net/project/showfiles.php?group_id=64348
  ireport也是一个挂在sourceforge下的项目,它的自我介绍是:
iReport is the most popular visual reporting tool for JasperReports (Java reporting library) and JasperServer (reporting server). You can manage charts, images, subreports, etc. Data sources: JDBC, TableModels, JavaBeans, XML, Hibernate, CSV etc. Output
  注意下载的ireport和jasperreport的版本似乎要求一致,另外貌似还有netbeans的插件版。
  jasperreport是java程序所以直接下载jar包即可
https://sourceforge.net/project/showfiles.php?group_id=36382&package_id=28579

下载好ireport之后你直接运行bin目录下的对应你的系统的执行文件。

最后再吐槽一句:
其实ireport现在的版本是一个和netbeans有着相当关联的东西,可以当作是netbeans的一个可视化报表设计改进版。
而jasperreport其实就是它的编译器了。
注:3月25日,ireport发布了最新的3.50版。

为你的网站创建一个IE8 Web Slice

  IE8的Web Slice不同于原来的那种栏目标签只显示一个标题在favourite bar那样,它能够简要的显示网站所有者定义的一个web slice的内容,Digital Inspiration的作者自己演示了这个效果,我就直接帖它的截图:
  按照微软自己的定义,web slice可以让用户方便在浏览器的收藏夹栏上查阅自己感兴趣的简短的消息,比如淘宝上的竞拍价格,天气预报,股票价格等等。可以说它相当于一个嵌入在浏览器中的小网页。
  那么,接下来我们就来研究一下如何快速的为你的网站创建一个web slice。我这里用digital inspiration的实例,虽然它是for wordpress的,但是其实本质了解了就一样了:

MSDN Library已经有很不错的guide文章和个性化定制的文章了

要创建一个web slice其实是非常简单的:

 <html><head>
<title>Page Title</title>
</head><body>
<div class="hslice" id="techologynews">
<h2 class="entry-title">IE 8 web slice</h2>
<div class="entry-content">
<p><a href="'#'">Link 1</a></p>
<p><a href="'#'">Link 2</a></p>
<p><a href="'#'">Link 3</a></p>
</div></div>
</body></html>

IE8 web slice只是一个简单的使用上面这个结构的html页面而已,你只需要指定它的标题和改变entry-content里面的每条项目内容即可。你也可以在这里定义你自己的css.
一下是一个wordpress的例子:

创建一个页面,比如webslice.php,把它放在wordpresss的安装路径下,内容:
<html><head>
<title>Page Title</title>
</head><body>
<div class="hslice" id="1">
<h2 class="entry-title">Your Site Name</h2>
<div class="entry-content"><ol>
<?php
require_once('wp-load.php');
$results = $wpdb->get_results("SELECT post_title, guid
FROM $wpdb->posts where post_status = 'publish'
ORDER BY ID DESC LIMIT 5");
foreach($results as $row) {
echo "<li><a href="'">guid . "'>"
. $row->post_title ."</a></li> \n";
}
?>
</ol></div></div>
</body></html>

这段代码连接到wordpress的数据库并且创造一个最新的post的列表,这个列表的内容将会被web slice读取。

2009-03-05

Skills of write a Scientific Paper

These post is my note of learning the skills of write a scientific paper.


The KEY characteristic of Scientific writing is clarity. Different frome general articals, Scientific writing should be as clear and simple as possible, in a word, the flowery literary embellishments which can cause confusion such as the metaphors, the similes, the idiomatic should NOT be used inwriting research papers

Title:
A good beginning is helf done, so is a good title to a paper, many people will read the title, therefore, all words in the title should be chosen with great care, a most common error is defective titles, we need a good title.
A good title use the fewest possible words that adequately describe the contents of the paper.
About the length:
    A title too short always do not helpful to potential reader, but a title too long often less meaningful than short ones. A good title should not contain "waste" words, such as "Studies on, ""Investigations on," and "Observations on." An opening "A," "An," or "The" is alos a waste word.
    The title of a paper is a label, In other words, the title normally is not a sentence, so it is simpler than a sentence, but the order of the words became even more important.
    Titles should almost never contain abbreviations, chemical formulas, proprietary names, jargon.

Abstract:
    Abstract is a miniature version of the paper. The Abstract should provide a brief summary of each of the main section of the paper: Introduction, Materials and Methods, Results, and Discussion. It should not exceed the length specified by the journal. So the main requirement of Abstract is enables reader identify the basic content of a paper quickly and accurately. Typically An Abstract should be typed as a single paragraph.
    The Abstract should :
  • State the principal objectives and scope of the investigation
  • Describe the methods employed
  • Summarize the results
  • State the principal conclusions (indicated by the fact that they are often given three times: once in the Abstract, again in the Introduction, and again in the Discussion.
    There are some types of Abstracts such as: informative abstract, indicative abstract.
    A informative abstract should briefly state the problem, the method used to study the problem, and the principal data and conclutions. this type of abstract require readers read the full paper.
    A indicative abstract is designed to indicate the subjects dealt with in a paper, this allow potential readers to decide whether to read the paper. It can seldom serve as a substitute for the full paper, but just be used in other types of publications.

2009-03-02

ffmpeg使用x264编码的配置 + ffmpeg与 x264编码器参数完整对照表

  使用ffmpeg进行.264编码的相关文章比较少,google了一下,特总结如下:

  • qscale的取值可以是0.01-255但实际使用超过50就很糟糕了
  • ffmpeg的cbr模式可以把码率控制的不错,但是vbr无法限制最高码率(虽然有max的设置,但是程序没有实现)
  • x264标准的封装是x264+aac in flv或者x264+aac in MP4

接下来说明下ffmpeg命令行的语法规则(本块内容来自2009-03-02官方文档):
语法规则结构:
ffmpeg [[infile options][`-i' infile]]... {[outfile options] outfile}...
一个最简单的命令形式:
ffmpeg -i input.avi -b 64k output.avi

这个命令把视频以64k的码率重编码。
显然,输入文件前面要加一个-i选项下面介绍一些有用的全局参数:
  • -formats 参数。会显示你机器当前支持的封装、编码、解码器的信息
  • -y参数,会指示ffmpeg覆盖输出文件
  • -t 指定视频流持续的时常,支持以秒为单位的数字或"时:分:秒[.毫秒]"
  • -fs 指定输出文件大小的限制
  • -ss 指定开始的时间,和-t的单位一样
  • -target 直接设定你想要转成的目标格式,所有的相关设置都会采用内设值,当然也你也可以加上自己要修改的参数。可用的选择有:
    "vcd", "svcd", "dvd", "dv", "dv50", "pal-vcd", "ntsc-svcd", ...
    这个例子把视频转换成vcd的格式
    ffmpeg -i myfile.avi -target vcd /tmp/vcd.mpg
接下来介绍视频选项:
  • -b 指定码率注意单位是bit/s,所以我们一般要加k,比如 -b 1000k 就是1000kb/s
  • -g 设置组的大小
  • -vframes 指定要编码的帧数,比如-vframes 1 就是编码1帧,截图的时候就这样写.
  • -r 指定帧率,默认是25
  • -s 指定图像分辨率,用wxh的格式,比如320x240
  • -aspect 指定宽高比 可以些16:9这种,也可以写小数比如1.3333
  • -croptop 指定顶部裁减多少像素,类似的还有-cropleft -cropright -cropbuttom
  • -bt 设置比特率容许的误差,默认4000k,在第一阶段时使用这个参数会告诉码率控制器能够偏移平均码率多远,这个选项和最大最小码率无关.设太小了不利于质量
  • -maxrate 和-minrate 指定允许的最大和最小码率,一般如果要用cbr模式编码的话会用这个:
    ffmpeg -i myfile.avi -b 4000k -minrate 4000k -maxrate 4000k -bufsize 1835k out.m2v
    否则用处不大
  • -vcodec 强制使用某种编码器
  • -sameq 使用和源文件相同的质量,这个选项是动态码率的
  • -pass 指定编码阶段,这个只有1和2,第一阶段的时候应该不处理音频,并且把输出导向空,比如:
    ffmpeg -i foo.mov -vcodec libxvid -pass 1 -an -f rawvideo -y NUL
    ffmpeg -i foo.mov -vcodec libxvid -pass 1 -an -f rawvideo -y /dev/null
  • -qscale 使用固定量化因子来量化视频这个是在vbr模式的,前面有提到,越小质量越好,不要超过50,相关的参数还有-qmin --qmax用来设定最大最小可使用的量化值
  • -qdiff 指定固定量化器因子允许的最大偏差
  • -qblur 指定量化器模糊系数,可用范围是0.0-1.0越大使得码率在时间上分配的越平均
  • -qcomp 指定视频量化器压缩系数,默认0.5
  • -me_method 指定运动估计方法(motion estimation method),可用的选择从垃圾到好排列如下:
    zero (0向量)
    phods
    log
    x1
    hex
    umh
    epzs (默认)
    full (完全搜索,很慢又好不到哪里去)
  • -mbd 设定宏模块决策,可用的值:
    0 使用mb_cmp,不知道是什么东西,所以这些参数我参考一下mencoder里面的
    1 选用需要比特最少的宏块模式
    2 选用码率失真最优的宏块模式
  • -4mv 使用宏块的4个运动向量,只支持mpeg4
  • -part 使用数据划分,只支持mpeg4
  • -ilme 强制允许交错的编码,只支持mpeg2和mpeg4,你可以选择用-deinterlace来去交错
音频部分:
  • -ar 设置采样频率,默认44100hz
  • -ab 设置比特率,默认64k
  • -an 禁用音频录制
  • -acodec 指定音频编码器


下面举几个x264编码的例子:
我使用mencoder调用x264编码一个psp用的视频:
x264+aac in mp4 for psp
mencoder -oac lavc -lavcopts acodec=libfaac:abitrate=94 -ovc x264 -x264encopts cabac=1:ref=3:deblock=1,-1,-1:analyse=0x1:0x111:me=umh:subme=9:psy_rd=0.9,0.0:mixed_ref=1:me_range=32:chroma_me=1:trellis=2:8x8dct=0:cmp=0:deadzone=21,11:chroma_qp_offset=-2:nr=0:decimate=0:mbaff=0:bframes=2:b_pyramid=0:b_adapt=1:b_bias=0:direct=3:wpredb=1:keyint=250:keyint_min=25:scenecut=40:rc=cqp:qp=18:ip_ratio=1.40:pb_ratio=1.30:aq=0 -lavdopts er=2 -pp 6 -of lavf -lavfopts format=psp -vf scale=480:-3
对应的ffmpeg编码参数是:
ffmpeg
ffmpeg -i inputfile.avi -f psp -acodec libfaac -ab 94k -vcodec libx264 -cqp 28 -coder 1 -refs 3 -deblockalpha 1 -deblockbeta -1 -me_method umh -subq 9 -me_range 32 -trellis 2 -chromaoffset -2 -nr 0 -bf 2 -b_strategy 1 -bframebias 0 -directpred 3 -g 250 -i_qfactor 1.3 -b_qfactor 1.4 -flags2 +bpyramid+wpred+mixed_refs+8x8dct -er 2 -s 480x320
需要注意的是,flags2里面那块,似乎要按照一定顺序才能正常工作,其他地方都差不多,详细情况可以从下面两篇文章得出:
第一篇是这个在网上被传了很多,但有些问题的对照表格,我修改了有问题的部分:
FFmpeg option x264 option
-g <frames> --keyint
-b <bits per second> --bitrate
-bufsize <bits> --vbv-bufsize
-maxrate <bits> --vbv-maxrate
-pass <1,2,3> --pass
-crf <float> --crf
-cqp <int> --qp
-bf <int> --bframes
-coder <0,1> --no-cabac
-bframebias <int> --b-bias
-keyint_min <int> --min-keyint
-sc_threshold <int> --scenecut
-deblockalpha <int>-deblockbeta <int> --deblock
-qmin <int> --qpmin
-qmax <int> --qpmax
-qdiff <int> --qpstep
-qcomp <float> --qcomp
-qblur <float> --qblur
-complexityblur <float> --cplxblur
-refs <int> --ref
-directpred <int> --direct
-me_method <epzs,hex,umh,full> --me
-me_range <int> --merange
-subq <int> --subme
-bidir_refine <0,1> --bime
-trellis <0,1,2> --trellis
-nr <int> --nr
-level <int> --level
-bt <bits> --ratetol = -bt / -b
-rc_init_occupancy <bits> --vbv-init = -rc_init_occupancy / -bufsize
-i_qfactor <float> --ipratio = 1 / -i_qfactor
-b_qfactor <float> --pbratio
-chromaoffset <int> --chroma-qp-offset
-rc_eq <string> --rc_eq
-threads <int> --threads
-cmp <-chroma/+chroma> --no-chroma-me
-partitions --partitions
+parti8×8 i8×8
+parti4×4 i4×4
+partp8×8 p8×8
+partp4×4 p4×4
+partb8×8 b8×8
-flags
-loop/+loop --no-deblock/–deblock
-psnr/+psnr --no-psnr/nothing
-flags2
+bpyramid --b-pyramid
+wpred --weightb
+brdo --b-rdo 我这里的ffmpeg已经不能用这个了
+mixed_refs --mixed-refs
+dct8×8 --8×8dct
-fastpskip/+fastpskip --no-fast-pskip
+aud --aud


下面是一篇关于这些参数详细解释的文章,转自:http://ffmpeg.x264.googlepages.com/mapping
一下是这篇文章在2008年11月19日更新的版本:

Frame-type options:

  • --keyint <integer> (x264)
    -g <integer>
    (FFmpeg)
    Keyframe interval, also known as GOP length. This determines the maximum distance between I-frames. Very high GOP lengths will result in slightly more efficient compression, but will make seeking in the video somewhat more difficult. Recommended default: 250

  • --min-keyint <integer> (x264)
    -keyint_min <integer> (FFmpeg)
    Minimum GOP length, the minimum distance between I-frames. Recommended default: 25

  • --scenecut <integer> (x264)
    -sc_threshold <integer> (FFmpeg)
    Adjusts the sensitivity of x264's scenecut detection. Rarely needs to be adjusted. Recommended default: 40

  • --pre-scenecut (x264)
    UNKNOWN (FFmpeg)
    Slightly faster (but less precise) scenecut detection. Normal scenecut detection decides whether a frame is a scenecut after the frame is encoded, and if so then re-encodes the frame as an I-frame. This is not compatible with threading, however, and so --pre-scenecut is automatically activated when multiple encoding threads are used.

  • --bframes <integer> (x264)
    -bf <integer> (FFmpeg)
    B-frames are a core element of H.264 and are more efficient in H.264 than any previous standard. Some specific targets, such as HD-DVD and Blu-Ray, have limitations on the number of consecutive B-frames. Most, however, do not; as a result, there is rarely any negative effect to setting this to the maximum (16) since x264 will, if B-adapt is used, automatically choose the best number of B-frames anyways. This parameter simply serves to limit the max number of B-frames. Note that Baseline Profile, such as that used by iPods, does not support B-frames. Recommended default: 16

  • --b-adapt <integer> (x264)
    -b_strategy <integer> (FFmpeg)
    x264, by default, adaptively decides through a low-resolution lookahead the best number of B-frames to use. It is possible to disable this adaptivity; this is not recommended. Recommended default: 1
  • 0: Very fast, but not recommended. Does not work with pre-scenecut (scenecut must be off to force off b-adapt).

    1: Fast, default mode in x264. A good balance between speed and quality.

    2: A much slower but more accurate B-frame decision mode that correctly detects fades and generally gives considerably better quality. Its speed gets considerably slower at high bframes values, so its recommended to keep bframes relatively low (perhaps around 3) when using this option. It also may slow down the first pass of x264 when in threaded mode.

  • --b-bias 0 (x264)
    -bframebias 0 (FFmpeg)
    Make x264 more likely to choose higher numbers of B-frames during the adaptive lookahead. Not generally recommended. Recommended default: 0

  • --b-pyramid (x264)
    -flags2 +bpyramid (FFmpeg)
    Allows B-frames to be kept as references. The name is technically misleading, as x264 does not actually use pyramid coding; it simply adds B-references to the normal reference list. B-references get a quantizer halfway between that of a B-frame and P-frame. This setting is generally beneficial, but it increases the DPB (decoding picture buffer) size required for playback, so when encoding for hardware, disabling it may help compatibility.

  • --no-cabac (x264)
    -coder 0,1 (FFmpeg)
    CABAC is the default entropy encoder used by x264. Though somewhat slower on both the decoding and encoding end, it offers 10-15% improved compression on live-action sources and considerably higher improvements on animated sources, especially at low bitrates. It is also required for the use of trellis quantization. Disabling CABAC may somewhat improve decoding performance, especially at high bitrates. CABAC is not allowed in Baseline Profile. Recommended default: -coder 1 (CABAC enabled)

  • --ref <integer> (x264)
    -refs <integer> (FFmpeg)
    One of H.264's most useful features is the abillity to reference frames other than the one immediately prior to the current frame. This parameter lets one specify how many references can be used, through a maximum of 16. Increasing the number of refs increases the DPB (Decoded Picture Buffer) requirement, which means hardware playback devices will often have strict limits to the number of refs they can handle. In live-action sources, more reference have limited use beyond 4-8, but in cartoon sources up to the maximum value of 16 is often useful. More reference frames require more processing power because every frame is searched by the motion search (except when an early skip decision is made). The slowdown is especially apparent with slower motion estimation methods. Recommended default: -refs 6

  • --no-deblock (x264)
    -flags -loop (FFmpeg)
    Disable loop filter. Recommended default: -flags +loop (Enabled)

  • --deblock (x264)
    -deblockalpha <integer>(FFmpeg)
    -deblockbeta <integer>(FFmpeg)
    One of H.264's main features is the in-loop deblocker, which avoids the problem of blocking artifacts disrupting motion estimation. This requires a small amount of decoding CPU, but considerably increases quality in nearly all cases. Its strength may be raised or lowered in order to avoid more artifacts or keep more detail, respectively. Deblock has two parameters: alpha (strength) and beta (threshold). Recommended defaults:-deblockalpha 0 -deblockbeta 0 (Must have '-flags +loop')

  • --interlaced (x264)
    UNKNOWN (FFmpeg)
    Enables interlaced encoding. x264's interlaced encoding is not as efficient as its progressive encoding; consider deinterlacing for maximum effectiveness.

Ratecontrol:

  • --qp <integer>(x264)
    -cqp <integer>(FFmpeg)
    Constant quantizer mode. Not exactly constant completely--B-frames and I-frames have different quantizers from P-frames. Generally should not be used, since CRF gives better quality at the same bitrate.

  • --bitrate <integer>(x264)
    -b <integer>(FFmpeg)
    Enables target bitrate mode. Attempts to reach a specific bitrate. Should be used in 2-pass mode whenever possible; 1-pass bitrate mode is generally the worst ratecontrol mode x264 has.

  • --crf <float>(x264)
    -crf <float>(FFmpeg)
    Constant quality mode (also known as constant ratefactor). Bitrate corresponds approximately to that of constant quantizer, but gives better quality overall at little speed cost. The best one-pass option in x264.

  • --vbv-maxrate <integer>(x264)
    -maxrate <integer>(FFmpeg)
    Specifies the maximum bitrate at any point in the video. Requires the VBV buffersize to be set. This option is generally used when encoding for a piece of hardware with bitrate limitations.

  • --vbv-bufsize <integer>(x264)
    -bufsize <integer> (FFmpeg)
    Depends on the profile level of the video being encoded. Set only if you're encoding for a hardware device.

  • --vbv-init <float>(x264)
    -rc_init_occupancy <float>(FFmpeg)
    Initial VBV buffer occupancy. Note: Don't mess with this.

  • --qpmin <integer> (x264)
    -qmin <integer> (FFmpeg)
    Minimum quantizer. Doesn't need to be changed. Recommended default: -qmin 10

  • --qpmax <integer> (x264)
    -qmax <integer> (FFmpeg)
    Maximum quantizer. Doesn't need to be changed. Recommended default: -qmax 51

  • --qpstep <integer> (x264)
    -qdiff <integer> (FFmpeg)
    Set max QP step. Recommended default: -qdiff 4

  • --ratetol <float>(x264)
    -bt <float>(FFmpeg)
    Allowed variance of average bitrate

  • --ipratio <float>(x264)
    -i_qfactor <float>(FFmpeg)
    Qscale difference between I-frames and P-frames.

  • --pbratio <float>(x264)
    -b_qfactor <float>(FFmpeg)
    Qscale difference between P-frames and B-frames.

  • --chroma-qp-offset <integer>(x264)
    -chromaoffset <integer>(FFmpeg)
    QP difference between chroma and luma.

  • --aq-strength <float> (x264)
    UNKNOWN (FFmpeg)
    Adjusts the strength of adaptive quantization. Higher values take more bits away from complex areas and edges and move them towards simpler, flatter areas to maintain fine detail. Default: 1.0

  • --pass <1,2,3> (x264)
    -pass <1,2,3>(FFmpeg)
    Used with --bitrate. Pass 1 writes the stats file, pass 2 reads it, and 3 both reads and writes it. If you want to use three pass, this means you will have to use --pass 1 for the first pass, --pass 3 for the second, and --pass 2 or 3 for the third.

  • --stats <string>(x264)
    UNKNOWN (FFmpeg)
    Allows setting a specific filename for the firstpass stats file.

  • --rceq <string>(x264)
    -rc_eq <string>(FFmpeg)
    Ratecontrol equation. Recommended default: -rc_eq 'blurCplx^(1-qComp)'

  • --qcomp <float>(x264)
    -qcomp <float> (FFmpeg)
    QP curve compression: 0.0 => CBR, 1.0 => CQP. Recommended default: -qcomp 0.60

  • --cplxblur <float>(x264)
    -complexityblur <float>(FFmpeg)
    Reduce fluctuations in QP (before curve compression) [20.0]

  • --qblur <float>(x264)
    -qblur <float>(FFmpeg)
    Reduce fluctuations in QP (after curve compression) [0.5]

  • --zones /(x264)
    UNKNOWN (FFmpeg)
    Allows setting a specific quantizer for a specific region of video.

  • --qpfile (x264)
    UNKNOWN (FFmpeg)
    Allows one to read in a set of frametypes and quantizers from a file. Useful for testing various encoding options while ensuring the exact same quantizer distribution.

Analysis:

  • --partitions <string> (x264)
    -partitions <string> (FFmpeg)

    p8x8 (x264) /+partp8x8 (FFmpeg)

    p4x4 (x264) /+partp4x4 (FFmpeg)

    b8x8 (x264) /+partb8x8 (FFmpeg)

    i8x8 (x264) /+parti8x8 (FFmpeg)

    i4x4 (x264) /+parti4x4 (FFmpeg)

    One of H.264's most useful features is the ability to choose among many combinations of inter and intra partitions. P-macroblocks can be subdivided into 16x8, 8x16, 8x8, 4x8, 8x4, and 4x4 partitions. B-macroblocks can be divided into 16x8, 8x16, and 8x8 partitions. I-macroblocks can be divided into 4x4 or 8x8 partitions. Analyzing more partition options improves quality at the cost of speed. The default is to analyze all partitions except p4x4 (p8x8, i8x8, i4x4, b8x8), since p4x4 is not particularly useful except at high bitrates and lower resolutions. Note that i8x8 requires 8x8dct, and is therefore a High Profile-only partition. p8x8 is the most costly, speed-wise, of the partitions, but also gives the most benefit. Generally, whenever possible, all partition types except p4x4 should be used.

  • --direct <integer>(x264)
    -directpred <integer>(FFmpeg)
    B-frames in H.264 can choose between spatial and temporal prediction mode. Auto allows x264 to pick the best of these; the heuristic used is whichever mode allows more skip macroblocks. Auto should generally be used.

  • --direct-8x8 (x264)
    UNKONWN (FFmpeg)
    This should be left at the default (-1).

  • --weightb (x264)
    -flags2 +wpred(FFmpeg)
    This allows B-frames to use weighted prediction options other than the default. There is no real speed cost for this, so it should always be enabled.

  • --me (x264)
    -me_method (FFmpeg)

    dia (x264) / epzs (FFmpeg) is the simplest search, consisting of starting at the best predictor, checking the motion vectors at one pixel upwards, left, down, and to the right, picking the best, and repeating the process until it no longer finds any better motion vector.

    hex (x264) / hex (FFmpeg) consists of a similar strategy, except it uses a range-2 search of 6 surrounding points, thus the name. It is considerably more efficient than DIA and hardly any slower, and therefore makes a good choice for general-use encoding.

    umh (x264) / umh (FFmpeg) is considerably slower than HEX, but searches a complex multi-hexagon pattern in order to avoid missing harder-to-find motion vectors. Unlike HEX and DIA, the merange parameter directly controls UMH's search radius, allowing one to increase or decrease the size of the wide search.

    esa (x264) / full (FFmpeg) is a highly optimized intelligent search of the entire motion search space within merange of the best predictor. It is mathematically equivalent to the bruteforce method of searching every single motion vector in that area, though faster. However, it is still considerably slower than UMH, with not too much benefit, so is not particularly useful for everyday encoding.

    One of the most important settings for x264, both speed and quality-wise.

  • --merange <integer>(x264)
    -me_range <integer>(FFmpeg)
    MErange controls the max range of the motion search. For HEX and DIA, this is clamped to between 4 and 16, with a default of 16. For UMH and ESA, it can be increased beyond the default 16 to allow for a wider-range motion search, which is useful on HD footage and for high-motion footage. Note that for UMH and ESA, increasing MErange will significantly slow down encoding.

  • --mvrange(x264)
    UNKNOWN (FFmpeg)
    Limits the maximum motion vector range. Since x264 by default limits this to 511.75 for standards compliance, this should not be changed.

  • --subme 6(x264)
    -subq 6(FFmpeg)

    1: Fastest, but extremely low quality. Should be avoided except on first pass encoding.

    2-5: Progressively better and slower, 5 serves as a good medium for higher speed encoding.

    6-7: 6 is the default. Activates rate-distortion optimization for partition decision. This can considerably improve efficiency, though it has a notable speed cost. 6 activates it in I/P frames, and subme7 activates it in B frames.

    8-9: Activates rate-distortion refinement, which uses RDO to refine both motion vectors and intra prediction modes. Slower than subme 6, but again, more efficient.

    An extremely important encoding parameter which determines what algorithms are used for both subpixel motion searching and partition decision.

  • --psy-rd <float>:<float> (x264)
    UNKNOWN (FFmpeg)
    First value represents the amount that x264 biases in favor of detail retention instead of max PSNR in mode decision. Requires subme >= 6. Second value is psy-trellis, an experimental algorithm that tries to improve sharpness and detail retention at the expense of more artifacting. Recommended starting values are 0.1-0.2. Requires trellis >= 1. Recommended default: 1.0:0.0

  • --mixed-refs(x264)
    -flags2 +mixed_refs(FFmpeg)
    H.264 allows p8x8 blocks to select different references for each p8x8 block. This option allows this analysis to be done, and boosts quality with little speed impact. It should generally be used, though it obviously has no effect with only one reference frame.

  • --no-chroma-me(x264)
    UNKNOWN (FFmpeg)
    Chroma is used in the last steps of the subpixel refinement by default. For a slight speed increase, this can be disabled (at the cost of quality).

  • --8x8dct (x264)
    -flags2 +dct8x8(FFmpeg)
    Gives a notable quality boost by allowing x264 to choose between 8x8 and 4x4 frequency transform size. Required for i8x8 partitions. Speed cost for this option is near-zero both for encoding and decoding; the only reason to disable it is when one needs support on a device not compatible with High Profile.

  • --trellis <0,1,2>(x264)
    -trellis <0,1,2>(FFmpeg)

    0: disabled

    1: enabled only on the final encode of a MB

    2: enabled on all mode decisions

    The main decision made in quantization is which coefficients to round up and which to round down. Trellis chooses the optimal rounding choices for the maximum rate-distortion score, to maximize PSNR relative to bitrate. This generally increases quality relative to bitrate by about 5% for a somewhat small speed cost. It should generally be enabled. Note that trellis requires CABAC.

  • --no-fast-pskip(x264)
    -flags2 -fastpskip(FFmpeg)
    By default, x264 will skip macroblocks in P-frames that don't appear to have changed enough between two frames to justify encoding the difference. This considerably speeds up encoding. However, for a slight quality boost, P-skip can be disabled. In this case, the full analysis will be done on all P-blocks, and the only skips in the output stream will be the blocks whose motion vectors happen to match that of the skip vector and motion vectors happen to match that of the skip vector and which have no residual. The speed cost of enabling no-fast-pskip is relatively high, especially with many reference frames. There is a similar B-skip internal to x264, which is why B-frames generally encode much faster than P-frames, but it cannot be disabled on the commandline.

  • --no-dct-decimate(x264)
    UNKNOWN (FFmpeg)
    By default, x264 will decimate (remove all coefficients from) P-blocks that are extremely close to empty of coefficents. This can improve overall efficiency with little visual cost, but may work against an attempt to retain grain or similar. DCT decimation should be left on unless there's a good reason to disable it.

  • --nr(x264)
    UNKNOWN (FFmpeg)
    a fast, built-in noise reduction routine. Not as effective as external filters such as hqdn3d, but faster. Since x264 already naturally reduces noise through its quantization process, this parameter is not usually necessary.

  • --deadzone-inter(264)
    --deadzone-intra (x264)
    UNKNOWN (FFmpeg)
    UNKNOWN (FFmpeg)
    When trellis isn't activated, deadzone parameters determine how many DCT coefficients are rounded up or down. Rounding up results in higher quality and more detail retention, but costs more bits--so rounding is a balance between quality and bit cost. Lowering these settings will result in more coefficients being rounded up, and raising the settings will result in more coefficients being rounded down. Recommended: keep them at the defaults.

  • --cqm (264)
    --cqpfile(x264)UNKNOWN (FFmpeg)
    UNKNOWN (FFmpeg)
    Allows the use of a custom quantization matrix to weight frequencies differently in the quantization process. The presets quant matrices are "jvt" and "flat". --cqpfile reads a custom quant matrices from a JM-compatible file. Recommended only if you know what you're doing.

2009-03-01

桑梓贴吧的flv封装的h.264编码环境部署

使用:

  • faac
  • faad
  • x264
  • mplayer
  • ffmpeg
  • amrwb+amrnb+26204-700.zip+26104-700.zip(用以解码3gp视频)
编译:
faac:
./configure
make
make install

faad:
./configure
make
make install

x264:
./configure --enable-shared
make
make install

mplayer和ffmpeg下载每日完全快照:
http://www.mplayerhq.hu/MPlayer/releases/mplayer-export-snapshot.tar.bz2
http://www.ffmpeg.org/releases/ffmpeg-checkout-snapshot.tar.bz2


amrwb+amrnb+26204-700.zip+26104-700.zip:
  amrwb是3gp的amr解码器,后面那两个zip文件是3gpp的ts的标准的源代码,对这个的解释如下:
The library itself is actually just a wrapper around the original code
released by 3GPP.

  如果你的服务器不能连接外网,需要把这两个文档从
http://www.3gpp.org/ftp/Specs/archive/26_series/26.204/26204-700.zip
http://www.3gpp.org/ftp/Specs/archive/26_series/26.104/26104-700.zip
  这两个地址下载来分别放在amrwb和amrnb的源代码的根目录下。
./configure
make
make install

ffmpeg:
./configure --prefix=/opt/DistributedConvertProgram/mediaPrograms/ffmpeg --enable-libfaac --enable-libfaad --enable-libx264 --enable-gpl --enable-shared --enable-libamr-nb --enable-libamr-wb --enable-nonfree

make
make install


简单说明:
  x264要使用--enable-shared的原因是ffmpeg编译的时候需要libx264.so
  ffmpeg使用--enable-shared的原因也是如此.

最后:
  注意,你可能要修改/etc/ld.so.conf这个文件,在其中加入对应的lib地址,并ldconfig才能保证不出现*.so文件找不到的情况

---------------------------------------------------------------------------------
09-03-11更新:ffmpeg编译时未添加amr支持,导致不支持3gp解码,已添加在上面.

编译安装Mencoder和FFMpeg

  由于这两个程序现在都基本不提供所谓的release了,很多新的功能必须使用svn的代码来编译安装,其实本来编译很简单,不过按照我们的需求来编有时候就会麻烦了。。
编译准备:
  先安装其他编码器:
  FAAC和FAAD:https://sourceforge.net/project/showfiles.php?group_id=704
  LAME:https://sourceforge.net/project/showfiles.php?group_id=290
  Theora:http://downloads.xiph.org/releases/theora/
  vorbis:http://downloads.xiph.org/releases/vorbis/
  x264:http://www.videolan.org/developers/x264.html

下载完以后一个个编译好。x264需要yasm
之后再编译mplayer和ffmpeg
mplayer最简单了,如果你不需要gui的话直接
./configure --prefix=dir_you_want
就可以了。不过注意,如果你编译的时候发现很多codec不支持的话记得要指定解码器目录
ffmpeg会麻烦一点,你编译ffmpeg的时候,可能需要
./configure --prefix=dir_you_want --enable-libmp3lame --enable-libvorbis --enable-libxvid --enable-shared --enable-libfaac --enable-libfaad --enable-gpl --enable-libtheora --enable-libx264
编译完成之后,跑ffmpeg发现
ffmpeg: error while loading shared libraries: libavdevice.so.52: cannot open shared object file
这样的错误,那有两种解决方法。
一个是把你用prefix指定的安装目录下的lib目录里面的文件link到/usr/lib中去。
另外一个是修改/etc/ld.so.conf
添加你prefix指定的目录的lib目录的绝对路径。
然后ldconfig即可。

------------------------------------------------------------------------
更新:
  如果你在使用libx264编码的时候遇到这样的错误:

[libx264 @ 0x9d515e0]no ratecontrol method specified

那么,80%的概率是你编译x264的时候使用了--enable-shared。这个选项引发了这个错误。具体原因似乎是没能加载所需要的动态库。
但是问题是,如果你想要ffmpeg能够使用libx264的话又必须要使用libx264.so.66这个动态库。否则你不能编译ffmpeg。所以这个问题相当奇怪。
我是在编译完ffmpeg之后重新编译x264才搞定的。
------------------------------------------------------------------------
更新:在另一台机器上编译过程不同于此,因此,本帖可能有错,待研究一下动态编译.