Linux下利用mencoder将字幕文件内嵌到视频之中 四月 24th, 2009
来源:www.mcuos.com
正文:
前提:先保证字幕文件在正常情况下是可用的,就是播放视频时能正常显示!详细信息可参考:http://www.mcuos.com/viewthread.php?tid=550&extra=page%3D1
关于内嵌字幕的问题网上也可以找到一些资料,虽然不是很多!但由于习惯问题,将一个参数的位置调换了,从而导致预想的结果迟迟未能出现,当然也浪费了很多时间和精力!下面就将该问题详细的探讨一下:
以下三条命令都是可用的,写法稍有不同,但功能是一样的:
- mencoder -o tt.avi -ovc lavc -oac copy -sub test.srt -subcp utf8 -subfont-text-scale 3 -font "/home/zwang/.mplayer/subfont.ttf" test.avi
- mencoder -o tt.avi -ovc lavc -oac copy -sub test.srt -subcp utf8 -subfont-text-scale 3 -font "WenQuanYi Bitmap Song" test.avi
- mencoder -o tt.avi -ovc lavc -oac copy -sub test.srt -subcp utf8 -subfont-text-scale 3 -fontconfig test.avi
参数说明:
- -o tt.avi 指定输出的目标文件名称
- -ovc lavc 指定文件视频编码方式(这里使用的是lavc编码格式),当然还可以使用更多参数,详情可参考mencoder的帮助文档
- -oac copy 指定文件音频编码方式(这里表示保持原格式不变),当然还可以使用更多参数,详情可参考mencoder的帮助文档
- -sub test.srt 指定使用的字幕文件,其它路径可自行修改
- -subcp utf8 指定字幕文件的编码方式(该编码方式与字幕文件的真实编码方式必须一致,否则结果会变成乱码)
- -subfont-text-scale 3 指定字体的大小(默认是5,该选项不是必须的)
- -font xx 指定所采用的字体文件,有两种写法,一种使用字体文件的路径,另一种是使用字体文件的名称!
- -fontconfig 帮助文档上的原文说明是“Enables the usage of fontconfig managed fonts.”我的理解就是使用系统字体配置文件里面的默认选项来指定字体文件,即使用的就是系统里的默认字体,所以如果使用该参数,则就不需要再使用- font来显式的指定字体文件了
- test.avi 指定要转换的源文件;该文件的位置非常重要,正是因为其位置问题,导致该实验迟迟不能成功!
需要注意的问题:
1、输入输出文件选项的位置问题:
以前的写法是:mencoder test.avi -ovc lavc -oac copy -sub test.srt -font "/home/zwang/.mplayer/subfont.ttf" -subcp utf8 -subfont-text-scale 3 -o tt.avi
可以看出与上面的可用命令相比,就是指定源文件的位置有了变化,但就是这么一点细微的差别,导致该命令是不可用的,转换后仅能看到一条横线,而不是文字!输出文件(-o tt.avi)的位置倒是无所谓,测试表明,无论放在命令行首还是行尾都是可以的!
2、编码选项问题:
笔者曾经想通过“-ovc copy -oac copy”参数快速的将字幕嵌入到视频之中,因为视频、音频编码都使用的是copy,所以也就没有编码转换操作,其实就是跟拷贝一个视频文件差不多了,速度当然是很快的!
不过很可惜,如此操作字幕是无法被嵌入的!测试表明,要想成功嵌入字幕,选项“-ovc”的参数值是绝对不能为copy的,而“-oac”倒是无所谓,具体原因笔者也解释不大清楚(不过倒是可以大胆猜测一下:因为字幕是可显示的,所以嵌入后的字幕应该属于视频流的一部分,而如果将-ovc”的参数值指定为copy,则就不会涉及到视频流的转换操作了,这样字幕当然也就没法被当作视频流嵌入到源视频流之中,也不知是不是这样?)!
数据库范式的日常语言表达-摘自MySQL 5 权威指南(第3版) 三月 1st, 2009
啤酒与尿布的故事可以休矣 一月 13th, 2009
其实到现在我还在怀疑"啤酒和尿布"故事的真实性。这个故事最开始应该是从一些做商务智能(BI) 的软件厂商那里传出来的,神乎其神。按理说,这个故事应该给超级市场以无限启发才对,可实际上在超市里面观察一下,发现根本没有类似的物品摆放,相近的都很少。更多的时候,"聚类"才是最大的关联性。
"智能"是一回事,凭借经验也同样能推导出所谓的"智能",找一些有经验的人站在收银台观察,应该也能同样总结出所谓的"模式",成本或许更低。软件有的时候也不过是对真实世界的模拟而已,何况很多时候只是"指哪打哪"似的模拟。
经常在网络上能看到一些人拿着这个故事生搬硬套自己的观点,什么数据仓库啊、数据挖掘、数据分析啊,商务智能啊,甚至什么数据库营销都拉上这个故事来显示所谓的重要性,诚可笑也。在实际的 IT 环境中,看到太多造出数据从而证明观点的例子了。
国内的互联网应用中,能看到的一个真正有突破的是淘宝以前的推荐系统,用户在搜索婴幼儿智力玩具的时候,关联搜 索会出现"孕妇减肥"相关的产品,稍微饶点弯才能发现其中的关联性,而且是真正的关联。这个还是有那么一点智能的意思的(不用去测试了,现在已经发生变化 了)。其他如豆瓣、Amazon(中国) 的购物推荐,基本上还是根据"类别"的信息做关联,看似智能,不过是程序帮你更多做了一步。
啤酒和尿布的故事可以休矣,以后可以用"智力玩具与减肥药"了。
--EOF--
如何使Windows Forms成为线程安全的 一月 5th, 2009
原始链接在这里
介绍
对于windows forms用户界面编程来说,如果不使用多线程的话,程序都是直接了当的。
但是在实际应用中,为了确保UI的响应性,就必须使用多线程。这就导致了界面开发变得复杂起来。
遇到的问题
如大家所知,windows forms并不是线程安全的。例如,除非你对消息队列进行了控制,那么对
Windows.Forms上的一个控件的属性值进行读写并不是安全的。这里的重点是,你只能通过消息
队列线程对你的Windows Forms上的控件进行修改。
标准解决方案
当然,我们有一个机制来解决这个问题。对于每一个Windows Forms的控件,都有一个 InvokeRequired
的属性。如果这个属性的值是False,那么当前的线程就是消息队列线程,你就可以对控件的属性进行
安全的读写。另外,还有一个方法 Invokde ,这个方法把一个delegate和他的参数一起放到某个控件
消息队列里面等待调用。
因为对delegate的调用是直接从消息队列里面发起的,所以没有什么threading相关的编程内容。但是这种
类型的编程是及其乏味的。仅仅为了设置一下一个Text的文本,或者enabling/disabling一个控件,你就
需要定义一个分离的方法和对应的delegate.
例子:随机字符串
为了说明这个情况,我写了一个小的Windows Forms程序来生成一个随机的字符串。下面的代码片段演示了如何
在消息循环队列和工作线程之间进行同步。
- char PickRandomChar(string digits)
- {
- Thread.Sleep(100);
- return digits[random.Next(digits.Length)];
- }
- delegate void SetBoolDelegate(bool parameter);
- void SetInputEnabled(bool enabled)
- {
- if(!InvokeRequired)
- {
- button1.Enabled=enabled;
- comboBoxDigits.Enabled=enabled;
- numericUpDownDigits.Enabled=enabled;
- }
- else
- Invoke(new SetBoolDelegate(SetInputEnabled),new object[] {enabled});
- }
- delegate void SetStringDelegate(string parameter);
- void SetStatus(string status) {
- if(!InvokeRequired)
- labelStatus.Text=status;
- else
- Invoke(new SetStringDelegate(SetStatus),new object[] {status});
- }
- void SetResult(string result) {
- if(!InvokeRequired)
- textBoxResult.Text=result;
- else
- Invoke(new SetStringDelegate(SetResult),new object[] {result});
- }
- delegate int GetIntDelegate();
- int GetNumberOfDigits()
- {
- if(!InvokeRequired)
- return (int)numericUpDownDigits.Value;
- else
- return (int)Invoke(new GetIntDelegate(GetNumberOfDigits),null);
- }
- delegate string GetStringDelegate();
- string GetDigits()
- {
- if(!InvokeRequired)
- return comboBoxDigits.Text;
- else
- return (string)Invoke(new GetStringDelegate(GetDigits),null);
- }
- void Work()
- {
- try
- {
- SetInputEnabled(false);
- SetStatus("Working");
- int n=GetNumberOfDigits();
- string digits=GetDigits();
- StringBuilder text=new StringBuilder();
- for(int i=0;i!=n;i++)
- {
- text.Append(PickRandomChar(digits));
- SetResult(text.ToString());
- }
- SetStatus("Ready");
- }
- catch(ThreadAbortException)
- {
- SetResult("");
- SetStatus("Error");
- }
- finally
- {
- SetInputEnabled(true);
- }
- }
- void Start()
- {
- Stop();
- thread=new Thread(new ThreadStart(Work));
- thread.Start();
- }
- void Stop()
- {
- if(thread!=null)
- {
- thread.Abort();
- thread=null;
- }
- }
我使用了 Thread.Abort ,因为这只是一个简单的示例。如果你正在执行一个在任何情况下都不能打断的操作,
那么使用一个flag来通知你的线程。
上面的代码里面有许多简单而重复的代码。比如在调用Invoke之前,你必要总要检查一下InvokeRequired.因为
如果消息队列还没有创建你就调用了Invoke,就会产生一个错误。
生成的线程安全wrappers
在之前的文章里面,我介绍了如何自动生成一个类的wrappers来"隐含"的实现一个接口。同样的代码进行扩展,
可以实现创建wrppers,然后自动的让线程来调用正确的方法。
稍后我将解释整个机制的工作原理,首先,我们看看怎么使用。
首先你公布出来相关的属性,不用关心线程编程相关的事情。这个事情即便你不使用多线程,也是打算要做的。
- public bool InputEnabled
- {
- set
- {
- button1.Enabled=value;
- comboBoxDigits.Enabled=value;
- numericUpDownDigits.Enabled=value;
- }
- }
- public string Status
- {
- set { labelStatus.Text=value;}
- }
- public int NumberOfDigits
- {
- get { return numericUpDownDigits.Value; }
- }
- public string Digits
- {
- get { return comboBoxDigits.Text; }
- }
- public string Result
- {
- set { textBoxResult.Text=value; }
- }
然后,你定义一个接口,包含所有的你打算从另外一个线程里面调用的属性或者方法。
- interface IFormState
- {
- int NumberOfDigits { get; }
- string Digits { get; }
- string Status { set; }
- string Result { set; }
- bool InputEnabled { set; }
- }
现在,在工作线程里面,你所要做的就是创建一个线程安全的wrapper然后使用,那些重复的代码你再也不需要输入了。
- void Work()
- {
- IFormState state=Wrapper.Create(typeof(IFormState),this);
- try
- {
- state.InputEnabled=false;
- state.Status="Working";
- int n=state.NumberOfDigits;
- string digits=state.Digits;
- StringBuilder text=new StringBuilder();
- for(int i=0;i
- {
- text.Append(PickRandomChar(digits));
- state.Result=text.ToString();
- }
- state.Status="Ready";
- }
- catch(ThreadAbortException)
- {
- state.Status="Error";
- state.Result="";
- }
- finally
- {
- state.InputEnabled=true;
- }
- }
工作机制
wrapper生成器使用System.Reflection.Emit来生成一个代理类,这个代理类包含接口所需的所有方法,同时他也包含访问属性
的方法,每个方法都有一个特定的签名(signature)。
在方法体里面,如果InvokeRequired的返回值是false,那么就直接调用原始的方法。这个检查是很重要的,为了如果form还没有
attached到一个消息线程的时候,调用也能够工作。
如果InvokeRequired返回true,那么一个指向原始的方法的delegate当作是调用这个form的Invode方法的参数传递进去。delegate
的类型被缓存,这样对于相同签名的方法,不会重复创建delegate类型。
因为wrapper生成器使用ISynchronizeInvoke这个接口来进行同步调用,所以你可以在非windows-forms的程序里面来使用。你要做的
只是实现接口和大概其自己实现一个类似消息队列的东西。
局限性和一些警告
需要理解的一个很重要的事情就是,使用线程安全的wrapper把线程同步这个事情给隐藏起来了,但是并不意味着没有做线程同步。
所以,如果使用线程安全的wrapper来访问一个属性,在InvokeRequired返回ture的情况下,比直接访问这个属性要慢的多。因此,
如果你从几个不同的线程里面对你的form做复杂的改动,最好是把他们放到一个方法里面一次完成,而不是分开几次来进行调用。
另外一个需要牢记在心的是,不是所有的类型在不进行同步的情况下进行线程间传递都是安全的。通常,只有类似int,DateTime,和
一些immutable reference类型,比如string,是安全的。如果你要从一个线程向另一个线程传递一个mutable reference类型,比如
StringBuilder,那么你一定要小心。如果这个object没有在不同线程里面改动,或者他本身是线程安全的,那么传递是ok的。如果有
任何疑问,做一个深拷贝传递好了,别使用引用。
Whildbey
这个就不翻译了。
北京移动GPRS流量资费大幅降价 一月 3rd, 2009
1月1日消息,中国移动北京公司(下称"北京移动")透露,旗下动感地带、全球通用户GPRS包月资费已经下调,除了原有套餐内含流量加倍外,超出部分的流量费用由0.03元/KB降为0.01元/KB。
动感地带用户5元包月流量由原来的10MB增至30MB,20元包月流量由50MB增至150MB,可以访问CMNET。
神 州行用户GPRS套餐流量没有调整,仍然是5元/10MB和15元/30MB,此外还有已经停止发展用户的15元不限量套餐,但是超出部分降为0.01元 /KB;北京移动特别提醒,神州行手机上网仅限CMWAP,如果用户访问"WWW"的互联网,将要额外按0.01元/KB计费。
全球通用户5元和20元档套餐与动感地带一致,此外100元可包2GB,200元包5GB,可以访问CMNET。
调整后的北京全球通用户GRPS套餐,与上海移动GPRS新套餐完全一致;不过上海移动套餐针对旗下所有用户,没有区分品牌;因此优惠较为彻底。
岁末年初,除了京沪穗等地的移动公司语音和数据套餐有所调整外,其他各省公司也多有一定幅度的降价或增加套餐内容。(新浪科技)
文泉驿微米黑:Google Droid的开源衍生字体 一月 1st, 2009
文泉驿项目在过去的四年中致力于开源中文字体开发, 部分已发布的字体作品已经得到国内外Linux发行版的广泛采用。在上个月末,Google的Android开发团队明确了Droid字体授权条款之后, 文泉驿的开发者正式启动了对Droid字体的补充和优化工作。该子项目的首期目标为补充Droid中所缺少的4500个GBK国家标准汉字。
目 前,文泉驿的开发者采用Ajax/Canvas/Persistent Storage等Web编程技术,完成了汉字组字界面的开发工作。用户不需要安装任何特殊的软件,仅通过浏览器(Firefox 3.0+)便可以参与汉字补全工作。为了早日让大家使用到这个开源字体,我们诚邀广大开源爱好者和使用者积极参与这个字体的开发。这项开发不要求用户拥有 任何专业编程知识,只要会写汉字就可以参与。
请感兴趣的朋友首先浏览我们的Flash动画演示,并理解制作工序和要求:
http://wenq.org/demo/fontopia_droid_tutorial.htm
进入字体的开发界面,请浏览文泉驿主页: http://wenq.org/
并点击页面中间需要制作的汉字列表。
由于字符编辑界面程序采用了部分最新的网页技术,目前只有Firefox 3.0以及更高版本支持,请使用其他浏览器的朋友下载并使用Firefox 3.0进行参与(下载地址 http://www.mozilla.com/firefox/ )。
开启SATA硬盘的DMA 十二月 31st, 2008
在新本本上的Gentoo 基本系统安装完成,但我的SATA硬盘被认成为hda而不是sda,且开机时提示DMA未打开.WIKI有一篇HOTO是讲如何打开硬盘的DMA的,可如今WIKI无法访问了,只能在Linuxsir上发帖求救了,现将解决的方法记录如下.
编译内核,注意以下选项:
Device Drivers --->
SCSI device support --->
<*> SCSI device support
<*> SCSI disk support
<*> SCSI CDROM support
<*> Serial ATA (prod) and Parallel ATA (experimental) drivers
选择对应的芯片组支持
< > ATA/ATAPI/MFM/RLL support ---> ##这个是重点,不要编译到内核中
最 后修改/etc/fstab,将/dev/hda*改为/dev/sda*;修改/boot/grub/grub.conf,将kernel行中的 root=/dev/hda*改为root=/dev/sda*,其它的不变(单独一行的root (hd*,*)无须修改!)
How to convert class/struct to a byte array 十二月 31st, 2008
With this class you can easy convert your class/struct to a byte array.
Very useful when using the socket.
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
class CommonConvertion
{
public static byte[] StructureToByteArray(object obj)
{
int Length = Marshal.SizeOf(obj);
byte[] bytearray = new byte[Length];
IntPtr ptr = Marshal.AllocHGlobal(Length);
Marshal.StructureToPtr(obj, ptr, false);
Marshal.Copy(ptr, bytearray, 0, Length);
Marshal.FreeHGlobal(ptr);
return bytearray;
}
public static void ByteArrayToStructure(byte[] bytearray, ref object obj)
{
int Length = Marshal.SizeOf(obj);
IntPtr ptr = Marshal.AllocHGlobal(Length);
Marshal.Copy(bytearray, 0, ptr, Length);
obj = Marshal.PtrToStructure(ptr, obj.GetType());
Marshal.FreeHGlobal(ptr);
}
}
Have fun.
史上最牛小偷:光天化日偷走发射塔 十二月 31st, 2008
偷钱偷车很常见,但偷走两座几十米高的通信发射塔,这样的事情还是头一回听说.
2008年4月,中国联通有限公司梅州分公司先后接到梅县畲江和石坑两地的用户投诉,说通讯突然中断,而且再无信号.公司分别派人到这两个基站查看,谁知道这两处的发射塔不见了,只剩下一个地基.原来这两个塔是被一个废品收购站拆走的.但是,废品收购站老板却称是联通公司自己要拆的,他还拿出一张联通公司 转卖发射塔的证明,上面盖有中国联通梅州分公司的公章.联通公司的人一看证明就叫起来,“这公章是伪造的”.
警方侦查发现,证明与公章都是一个名叫林某的当地男子一手操办的.2008年4月 11日,林某飞来到了涉案废品收购站,自称是中国联通有限公司梅州分公司的工作人员,拿出事先伪造的转卖铁塔证明.该证明称,要将位于石坑镇转水潭的30 米高“废旧”发射铁塔变卖,并要求由买方进行拆除.于是收购站以1.7万元的价格收购该铁塔.2008年4月21日,林某飞又以同样手段,将另外一座位于 畲江镇太湖村的50米高发射铁塔卖给收购站,这次他卖了4.5万元.
2008年11月28日,林某飞因盗窃罪被判有期徒刑11年,并处罚金人民币5万元.
来源:新华网
趁促销,在京东攒了一个机器。 十二月 30th, 2008
家里的用了5年的多的笔记本的屏幕坏了。就在京东攒了机器。配置如下
| 商品编号 | 商品名称 | 商品价格 | 商品数量 | |
| 108454 | AMD Athlon64×2(双核速龙)5000盒装CPU(Socket AM2/2.6GHz/1M二级缓存/三年质保) | 369.00 | 1 | |
| 127189 | 技嘉(GIGABYTE)GA-MA78GPM-DS2H主板(AMD780G/ AM2/AM2+)板载128M DDR3显存 | 599.00 | 1 | |
| 126833 | 威刚(V-Data)万紫千红 DDR2 800 2G台式机内存 | 106.00 | 2 | |
| 125848 | 西部数据(Western Digital)640G AAKS 7200转16M SATAII盒装硬盘 三年免费质保! | 419.00 | 1 | |
| 132156 | 明基(BenQ)22寸宽屏液晶显示器 G2200W (黑色) | 999.00 | 1 | |
| 132916 | 冠捷(AOC)睿力塔式机箱 6060D | 88.00 | 1 | |
| 123954 | 酷冷至尊(CoolerMaster)魔石350 峰值350W 2.2版电源 采用超静音12CM风扇 | 149.00 | 1 | |
| 114066 | 京东上门自提Diy服务(安装、指导外加兼容性保证) | 99.00 | 1 | |
| 126525 | 酷冷至尊(CoolerMaster)P91 AMD CPU散热器 适用于AMD 754/939/AM2平台 | 45.00 | 1 | |
支付金额¥2,979.00元 | ||||
主板的显卡能硬解压高清,显示器感觉有点大,右下角有白色光晕。不知道为什么,也懒的跑去换了。