纯粹是因为要申请邓白氏编码的时候用到。做个记录,中文从大到小,英文从小到大。有些词还是看一下。[更新]
中文地址的排列顺序是由大到小,如:X国X省X市X区X路X号,而英文地址则刚好相反,是由小到大。如上例写成英文就是:X号,X路,X区,X市,X省,X国。掌握了这个原则,翻译起来就容易多了!
X室 Room X
X号 No. X
X单元 Unit X
X号楼 Building No. X
X街 X Street
X路 X Road
X区 X District
X县 X County
X镇 X Town
X市 X City
X省 X Province
请注意:翻译人名、路名、街道名等,最好用拼音。
中文地址翻译范例:
Room 403, No. 37, SiFang Residential Quarter, BaoShan District
Room 201, No. 34, Lane 125, XiKang Road(South), HongKou District
Zhongzhou Road, Nanyang City
473000河南南阳市八一路272号特钢公司 李有财
No. 272, Bayi Road, Nanyang City
528400广东中山市东区亨达花园7栋702 李有财
Hengda Garden, East District
361012福建省厦门市莲花五村龙昌里34号601室 李有财
Room 601, No. 34 Long Chang Li
Xiamen, Fujian, China 361012
Cheng Nuo Ban, Gong Jiao Zong Gong Si
Xiamen, Fujian, China 361004
266042山东省青岛市开平路53号国棉四厂二宿舍1号楼2单元204户甲 李有财
NO. 204, A, Building NO. 1
The 2nd Dormitory of the NO. 4 State-owned Textile Factory
53 Kaiping Road, Qingdao, Shandong, China 266042
1、地址综述 名片的主要功能是通联,所以在名片上写上详细的家庭或单位通讯地址是必不可少的。
如下例:住址:浙江省台州市黄岩区天长路18号201室翻译成英文就是:Address: Room 201, 18 Tianchang Road, Huangyan District, Taizhou City, Zhejiang Province.对照上例,翻译时有几点需要注意:中文地址的排列顺序是由大到小: 国 柿市 区 路 号,而英文地址则刚好相反,是由小到大: 号 路(Road), 区(District), 市(City), 省(Province), 国。
地名专名部分(如”黄岩区”的”黄岩”部分)应使用汉语拼音,且需连写,如Huangyan不宜写成 Huang Yan。
以上给出了地点翻译的书写规则。接下去就地址内容进行详细分析。
完整的地址由:行政区划+街区名+楼房号三部分组成。
2、行政区划英译 行政区划是地址中最高一级单位,我国幅员辽阔,行政区划较复杂,总体上可分成五级(括号内所注为当前国内通用译名):
- 1)国家(State):中华人民共和国(the People’s Republic of China; P.R.China; P.R.C; China)
- 2)省级(Provincial Level):省(Province)、自治区(Autonomous Region )、直辖市(Municipality directly under the Central Government,简称Municipality);特别行政区(Special Administration Region; SAR)
- 3)地级(Prefectural Level):地区(Prefecture)、自治州(Autonomous Prefecture)、市(Municipality;City);盟(Prefecture);
- 4)县级(County Level):县(County)、自治县(Autonomous County)、市(City)、市辖区(District),旗(County)
- 5)乡级(Township Level):乡(Township)、民族乡(Ethnic Township)、镇(Town)、街道办事处(Sub-district)。
记录一下,真机编译的时候没问题,用模拟器的时候报:INSTALL_FAILED_NO_MATCHING_ABIS,查了一下原因。就是因为为了提速用了、x86的模拟,所以。。。
还好stackoverflow有人解决了这些问题:
1、http://stackoverflow.com/questions/24572052/install-failed-no-matching-abis-when-install-apk
2、http://stackoverflow.com/questions/24751350/install-failed-no-matching-abis-how-to-overcome
解决起来还是比较简单的,在app/build.grade的android节点下增加:
XML/HTML代码
- abi {
- enable true
- reset()
- include 'x86', 'armeabi-v7a'
- universalApk true
- }
- }
一切就OK了,再编译的时候就:
XML/HTML代码
- 01/14 09:36:59: Launching app
- $ adb install-multiple -r /xxxxx/app/build/outputs/apk/app-x86-debug.apk /xxxxx/app/build/intermediates/split-apk/debug/slices/slice_5.apk /xxxxx/app/build/intermediates/split-apk/debug/slices/slice_6.apk /xxxxx/app/build/intermediates/split-apk/debug/slices/slice_9.apk /xxxxx/app/build/intermediates/split-apk/debug/slices/slice_2.apk /xxxxx/app/build/intermediates/split-apk/debug/dep/dependencies.apk /xxxxx/app/build/intermediates/split-apk/debug/slices/slice_8.apk /xxxxx/app/build/intermediates/split-apk/debug/slices/slice_7.apk /xxxxx/app/build/intermediates/split-apk/debug/slices/slice_3.apk /xxxxx/app/build/intermediates/split-apk/debug/slices/slice_4.apk /xxxxx/app/build/intermediates/split-apk/debug/slices/slice_0.apk /xxxxx/app/build/intermediates/split-apk/debug/slices/slice_1.apk
- Split APKs installed
- $ adb shell am start -n "com.xxxxx.app/com.xxxxx.app.activity.StartActivity" -a android.intent.action.MAIN -c android.intent.category.LAUNCHER
- $ adb shell am startservice com.xxxxxx.app/com.android.tools.fd.runtime.InstantRunService
- Connected to process 3689 on device emulator-5554
居然切成了10个apk.....
迁移的时候发现,后台的fck编辑器出不来。以前是用firefox的所以没问题,后来也是在使用chrome的时候才有注意(新版的fckEditor早就没有这个问题了,新版已经叫CKEditor了)
1、修改admin/editor/fckeditor_php5.php ,现在应该没有人用4了,直接改5,
同名方法覆盖一下
- function IsCompatible()
- {
- global $HTTP_USER_AGENT;
-
- if(isset($HTTP_USER_AGENT)){
- $sAgent = $HTTP_USER_AGENT;
- } else{
- $sAgent = $_SERVER['HTTP_USER_AGENT'];
- }
-
- if(strpos($sAgent, 'MSIE') !== false && strpos($sAgent, 'mac') === false && strpos($sAgent, 'Opera') === false){
- $iVersion = (float) substr($sAgent, strpos($sAgent, 'MSIE') + 5, 3);
- return ($iVersion >= 5.5);
- } else{
- if(strpos($sAgent, 'Gecko/') !== false){
- $iVersion = (int) substr($sAgent, strpos($sAgent, 'Gecko/') + 6, 8);
- return ($iVersion >= 20030210);
- } else{
- if(strpos($sAgent, 'Opera/') !== false){
- $fVersion = (float) substr($sAgent, strpos($sAgent, 'Opera/') + 6, 4);
- return ($fVersion >= 9.5);
- } else{
- if(preg_match("|AppleWebKit/(\d+)|i", $sAgent, $matches)){
- $iVersion = $matches[1];
- return ($matches[1] >= 522);
- } else{
- return false;
- }
- }
- }
- }
- }
2、修改fckeditor.js,将两个配置的False改为true即可:
JavaScript代码
- this.EnableSafari = true ;
- this.EnableOpera = true ;
这两个默认是false,改为true即可。
再打开sablog的后台,就OK了。
--------纯记录,下次再手贱的时候就不需要折腾N久了
折腾了两个小时左右,sablog基本迁移成功(不过我是在全新代码下的,我线上的代码有过一部分改动,估计到时候还要折腾一下)
主要是几个地方:
1、db_mysql类。目前我凡是用到的地方,都已经判断过了。可能还有坑
2、preg_replace_callback,点了很多页面,目前也基本上都已经OK了。
原程序用的是error_reporting(0),所以一些notice,warning都不会显示 。所以极大的可能是一出错就白屏。我改成error_reporting(7),大部分问题都解决了。
准备什么时候迁移的时候再试一下。(服务器上还有不少站点。还要备份数据库,太累了,升还是不升,这是个问题!)
这两天一直在纠结视频相关。用MP4的话,直接video标签+mp4的话,默认缓冲至少要5M左右 。如果是移动端,5M 花的时间太长了。所以才尝试用m3u8来解决(嗯。ffmpeg直接支持将视频切成ts,同时生成m3u8文件。我这里就不写了。网上例子太多太多了)
以下内容来自:http://blog.sina.com.cn/s/blog_6cf7acdf0102v0xv.html
1. M3U8文件概念
M3U8文件是指UTF-8编码格式的M3U文件。M3U文件是记录了一个索引纯文本文件,打开它时播放软件并不是播放它,而是根据它的索引找到对应的音视频文件的网络地址进行在线播放。
2. M3U8文件举例
例如使用云图TV点播直播节目时,发送请求:
http://121.199.63.236:7613/m3u8/cckw1/szws.m3u8?from=bab&fun=yes&chk=y&chunk=xax&ppw=yuntutv&auth=yuntutvyuntutvyuntutv&auth=yuntutvyuntutvyuntutv&nwtime=1406515232&sign=033d5483609e6bc87987fc7d2f30a024
返回M3U8文件,文件内容如下:
XML/HTML代码
- #EXTM3U
- #EXT-X-MEDIA-SEQUENCE:140651513
- #EXT-X-TARGETDURATION:10
-
- #EXTINF:8,
- http://vapp1.fw.live.cntv.cn/cache/289_/seg0/index140651513[140651513].ts
-
- #EXTINF:9,
- http://vapp1.fw.live.cntv.cn/cache/289_/seg0/index140651514[140651514].ts
-
- #EXTINF:11,
- http://vapp1.fw.live.cntv.cn/cache/289_/seg0/index140651515[140651515].ts
-
- #EXTINF:10,
- http://vapp1.fw.live.cntv.cn/cache/289_/seg0/index140651516[140651516].ts
-
- #EXTINF:12,
- http://vapp1.fw.live.cntv.cn/cache/289_/seg0/index140651517[140651517].ts
-
- #EXTINF:8,
-
- http://vapp1.fw.live.cntv.cn/cache/289_/seg0/index140651518[140651518].ts
-
- #EXTINF:12,
- http://vapp1.fw.live.cntv.cn/cache/289_/seg0/index140651519[140651519].ts
-
- #EXTINF:8,
- http://vapp1.fw.live.cntv.cn/cache/289_/seg0/index140651520[140651520].ts
-
- #EXTINF:9,
- http://vapp1.fw.live.cntv.cn/cache/289_/seg0/index140651521[140651521].ts
-
- #EXTINF:13,
- http://vapp1.fw.live.cntv.cn/cache/289_/seg0/index140651522[140651522].ts
然后根据索引的中链接请求下载音视频并进行播放
3. M3U文件标签及属性说明
M3U文件中可以包含多个tag,每个tag的功能和属性如下:
#EXTM3U
每个M3U文件第一行必须是这个tag,请标示作用
#EXT-X-MEDIA-SEQUENCE:140651513
每一个media URI 在 PlayList中只有唯一的序号,相邻之间序号+1, 一个media URI并不是必须要包含的,如果没有,默认为0
#EXTINF:,
duration 指定每个媒体段(ts)的持续时间(秒),仅对其后面的URI有效,title是下载资源的url
#EXT-X-TARGETDURATION
指定最大的媒体段时间长(秒)。所以#EXTINF中指定的时间长度必须小于或是等于这个最大值。这个tag在整个PlayList文件中只能出现一 次(在嵌套的情况下,一般有真正ts url的m3u8才会出现该tag)
#EXT-X-KEY
表示怎么对media segments进行解码。其作用范围是下次该tag出现前的所有media URI,属性为NONE 或者 AES-128。NONE表示 URI以及IV(Initialization Vector)属性必须不存在, AES-128(Advanced EncryptionStandard)表示URI必须存在,IV可以不存在。
对于AES-128的情况,keytag和URI属性共同表示了一个key文件,通过URI可以获得这个key,如果没有IV(Initialization Vector),则使用序列号作为IV进行编解码,将序列号的高位赋到16个字节的buffer中,左边补0;如果有IV,则将改值当成16个字节的16进制数。
#EXT-X-PROGRAM-DATE-TIME
将一个绝对时间或是日期和一个媒体段中的第一个sample相关联,只对下一个meida URI有效,格式如#EXT-X-PROGRAM-DATE-TIME:
For example: #EXT-X-PROGRAM-DATE-TIME:2010-02-19T14:54:23.031+08:00
#EXT-X-ALLOW-CACHE
是否允许做cache,这个可以在PlayList文件中任意地方出现,并且最多出现一次,作用效果是所有的媒体段。格式如下:#EXT-X-ALLOW-CACHE:
#EXT-X-PLAYLIST-TYPE
提供关于PlayList的可变性的信息, 这个对整个PlayList文件有效,是可选的,格式如下:#EXT-X-PLAYLIST-TYPE::如果是VOD,则服务器不能改变PlayList 文件;如果是EVENT,则服务器不能改变或是删除PlayList文件中的任何部分,但是可以向该文件中增加新的一行内容。
#EXT-X-ENDLIST
表示PlayList的末尾了,它可以在PlayList中任意位置出现,但是只能出现一个,格式如下:#EXT-X-ENDLIST
#EXT-X-MEDIA
被用来在PlayList中表示相同内容的不用语种/译文的版本,比如可以通过使用3个这种tag表示3中不用语音的音频,或者用2个这个tag表示不同角度的video在PlayLists中。这个标签是独立存在的,属性包含:
URI:如果没有,则表示这个tag描述的可选择版本在主PlayList的EXT-X-STREAM-INF中存在;
TYPE:AUDIO and VIDEO;
GROUP-ID:具有相同ID的MEDIAtag,组成一组样式;
LANGUAGE:确定使用的主要语言
NAME:人类可读的语言的翻译
DEFAULT:YES或是NO,默认是No,如果是YES,则客户端会以这种选项来播放,除非用户自己进行选择。
AUTOSELECT:YES或是NO,默认是No,如果是YES,则客户端会根据当前播放环境来进行选择(用户没有根据自己偏好进行选择的前提下)。
#EXT-X-STREAM-INF
指定一个包含多媒体信息的 media URI 作为PlayList,一般做M3U8的嵌套使用,它只对紧跟后面的URI有效,格式如下:#EXT-X-STREAM-INF:有以下属性:
BANDWIDTH:带宽,必须有。
PROGRAM-ID:该值是一个十进制整数,惟一地标识一个在PlayList文件范围内的特定的描述。一个PlayList 文件中可能包含多个有相同ID的此tag。
CODECS:不是必须的。
RESOLUTION:分辨率。
AUDIO:这个值必须和AUDIO类别的“EXT-X-MEDIA”标签中“GROUP-ID”属性值相匹配。
VIDEO:同上
参考文档:
http://blog.csdn.net/jwzhangjie/article/details/9744027
http://www.xuebuyuan.com/1726264.html
--------EOF--
上述的内容中有几个标签是必须 的
1、#EXTM3U
2、#EXT-X-TARGETDURATION:10,这个好象一定要是整型。否则可能会认不出
3、#EXTINF:8, 这个数字就是下面一行视频对应的时间长度,可以是浮点型
4、#EXT-X-ENDLIST ,如果是直播这个可以不要,否则还是留着吧
本来我是用PHP+Ngx_http_mp4_module来生成的。直接将视频处理成start=? &end =?,然而看起来很美,这些数据可能会破会源文件,导致在实际播放的时候会不正常,直接就卡住,看浏览器的网络管理中会发现,文件读取失败。
所以最终没办法,只有靠ffmpeg进行文件切割。这时候就相对能看得出了。即使你约定按20秒切分,切出来的文件也是不一样的大小的,而且时长还真不能保证都一样是20s,果然 所谓的无损分割是有讲究的。这里就不深究了。
换成m3u8后,配合ngx_http_accesskey_module可以做一些简单的鉴权。防盗链吧。
总算还好。最终还算是搞定了。做个笔记