问题描述
文件打包和归档是常用功能。windows下使用gbk和gb18030编码,而linux下都是utf8编码。这样会造成,在windows下打包的zip文档在linux下乱码,在linux下tar的文档在windows下乱码。
比如zip文件,在windows下:
当你谈论“看一个视频”的时候,你实际上是在谈论一个视频流和一个音频流的合成的内容。但是并不存在两个不同的文件。你似乎只有“这个视频”。也许它是一个avi文件,或者mp4文件。它们只是容器格式,类似zip文件包含了多种文件类型的文件。容器格式定义了怎么在单一的文件中存储视频和音频流。
当你“看一个视频”的时候,视频播放器在做以下一些事情:
- 解释容器格式,从中找到那些视频和音频track可用,它们是如何存储在文件中的,并可读取它们的数据,为下一步解码做准备;
- 解码视频流,显示一系列的图片到屏幕上;
- 解码音频流,发送声音到音箱。
你也许会想,视频文件就是比如“avi文件”或者“mp4文件”。而实际上,avi和mp4只是容器格式。好比zip文件,里面可以包含各种文件,视频容器格式只是定义了怎么存储数据,而不论存储什么类型的数据。不过视频容器格式比这个更复杂一些,因为不是所有的视频流格式兼容所有的视频容器格式。
一个视频文件一般包含多个track,而每个视频track(没有音频)又可对应一到多个音频track。这些track又总是相互关联的。每个音频track内部包含标记用于和视频同步。每个track可包括元数据,比如视频track的纵横比(视频长和宽),或者音频track的语言。容器也可以有元数据,比如视频自身的题目,视频的封面,片段号码(用于在电视上展示)等等。
在过去四年里,如果你访问过youtube.com(或者国内的比如youku.com),你可以看到视频可以嵌入到网页当中。
但是在html5以前,没有基于标准的方式来实现这种功能。实际上,你看到的在网页上的视频,是通过第三方的插件实现的,也许是quicktime,或者realplayer,或者flash(youtube和国内的很多视频网站都是用的flash)。这些插件和浏览器集成的很好,让你感觉不到在使用它们,除非你在一个不支持这个插件的平台观看它,比如ubuntu linux下面的浏览器就默认没有安装flash插件。
html5定义了标准的方式在网页中嵌入视频,使用<video>标签。对<video>标签的支持还在发展当中,至少不是在所有的地方可用,以下显示<video>标签浏览器支持情况:
chromium是chrome的开源版本。在Linux环境下只有这个。ubuntu下的安装,见:
http://www.ubuntugeek.com/install-chromium-google-chrome-web-browser-in-ubuntu.html
买了一部htc g3,用于测试flash播放。买回来是安卓g3安逸版1.0,带一个很难看的“心机”界面,据说是为了掩盖屏幕上的亮点。
令人失望的是g3虽然支持flash,但是依然不能在浏览器中播放flash视频,比如通过jw flv player。以为是版本比较老造成的,刷了最新的安卓安逸版1.1。问题依旧,于是刷了最新的亚洲官版(2.73.728.5),发现没有market,另外,就是root权限没有了,并且flash依然不是最新的10.1。
经过几天折腾,终于刷回带root权限的安卓安逸版1.1了。
phpbb中的bbcode功能很强大,可以定制任意格式的html内容。但是对管理员和用户有一定要求。
为phpbb增加了table功能,见:
增加的步骤,参见:
mp4经过处理,可以通过apache以流的方式播放,见:使用h264 http伪流传输视频。
这里用flash player和html5分别实现了mp4在浏览器的播放。
其中flash player使用了jw flv player,网址见:
下载只需输入邮箱地址即可。该网站有很友好的向导帮助你生成使用flash播放器的代码。这里是我的代码,做了个别的改动:
<script type=’text/javascript’ src=’swfobject.js’></script>
<div id=’mediaspace’>This text will be replaced</div>
<script type=’text/javascript’>
var so = new SWFObject(‘player.swf’,'mpl’,’800′,’600′,’9′);
so.addParam(‘allowfullscreen’,'true’);
so.addParam(‘allowscriptaccess’,'always’);
so.addParam(‘wmode’,'opaque’);
so.addVariable(‘file’,’http://marshal.easymorse.com/test.mp4′);
so.addVariable(‘image’,'preview.jpg’);
so.write(‘mediaspace’);
</script>
使用java编写webservice已经简单多了,但是要借助第三方工具或者框架,比如spring,学习成本还是比较高的。
groovy可以瞬间搭建起webservice的服务。
webservice基本原理
先简单介绍一下webservice。一般使用的是http协议(也可以是其他传输协议的),传输xml格式文本信息。一般用webservice做RPC,也就是Remote Procedure Call,即远程过程调用。
远程过程调用是和本地过程调用相对的,本地过程调用,就是比如java代码里面调用一个方法,那么有方法参数,调用后有返回值。
远程过程调用无非是通过网络远程调用一个“方法”而已。可以近似的认为,方法名是一个url,方法的参数是http请求部分,返回值是http响应。
webservice通过http传输的文本格式,是遵循xml格式的,而且,可以看出有一定的文档格式,这个格式是就是soap协议。
刚才说的都是比较底层和基本的原理,实际上编程语言调用webservice,使用编程语言自带的webservice API,已经不会碰到这样底层的东西了,比如说操作http请求和响应,比如java,看上去很像调用一个java方法一样。