qiming's profile陆其明 - 逐日PhotosBlogListsMore Tools Help

Blog


    2/17/2009

    CString是MFC类吗?

    答案是:曾经是,但现在不是了。这个问题困扰了我一段时间,因为时不时会在非MFC的项目中看到别人使用CString;只是这类技术细节也不是什么大不了的事,以往并没有深究。今天突然来了点兴致,在MSDN上查到这样一段话:
     
    ATL/MFC Shared Classes
    Beginning with Visual C++ .NET 2002, several existing MFC utility classes were rewritten or revised to reduce their dependencies on other MFC classes. These utility classes can now be used in any native C++ project. This section only includes classes that were previously available to MFC projects and have now been shared, plus a few new classes related to the changes in CString. It does not include the ATL classes, which can be used in any native C++ project type by inclusion of the appropriate header.
     
     
    Classes Shared Between MFC and ATL:
     
    10/21/2008

    画面显示比率和遥控器上的调整

    一张DVD电影碟片,其解码出来的视频画面大小总是固定的。比如NTSC的DVD,总是720x480(其实不一定,但可以姑且这么认为),显示比例为4:3。不过,值得注意的是,现代的DVD Player和电视机都有比较强的图像处理功能,通过一些设置可以调整视频的显示比例,以让DVD观看效果达到最佳。

    举个实际一点的例子吧!假设现在有一个DVD Player,它的遥控器上可以设置4:3或16:9的画面显示比例;还有一个高清数字电视机(16:9),它的遥控器也可以设置4:3或16:9的画面显示比例;再有一张NTSC的DVD碟片,它的情景内容是16:9的,但因为要编码成4:3比例放到DVD碟片上,所以在编码时情景内容上下都加了黑边。当这张DVD碟片插入Player中播放时,很有可能看起来就是四周都有黑边的,虽然情景内容保持着良好的16:9的比例,但它蜷缩在中间,怪怪的!

    这时,通过Player遥控器,设置视频输出为16:9。于是,Player会对DVD解码出来的图像进行数字处理,把上下的两条黑边给去掉了,只输出16:9的情景内容。遗憾的是,连着Player的电视机仍然工作在4:3比例的显示模式下,于是电视机就对接收到的视频图像做了一次16:9到4:3的转换。(各种电视机的处理不尽相同:也许有的电视机马上能检测出来、自动调整到16:9的显示模式,有的可能给Player输出的图像上下加黑边,有的可能把Player输出的图像左右两边切掉一些后全局放大;我们这个例子假设是最后一种情况)。既然电视机直接支持16:9的显示,那么电视机这次做的16:9到4:3的图像转换完全是没必要的。接下去,通过电视机的遥控器,将画面显示比例设为16:9。最后的结果是,16:9的DVD情景内容完全地占满了整个电视机的屏幕,周围没有任何黑边,看起来多爽!!!

    经验总结: 如果在播放一张DVD碟片的时候,发现情景画面的四周都有黑边,那么你肯定可以通过Player或电视机的遥控器来做些调整。

    3/19/2007

    spoolsv.exe占用CPU 99%

    今天,我的笔记本碰到一件妖怪事:启动以后,CPU就是100%,打开任务管理器,发现spoolsv.exe在作祟。网上搜了一把,原来要这么解决...
     
    1. 重启电脑,按F8,选择进入安全模式;
    2. 降c:\windows\system32\spool\printers目录下的所有文件删除;
    3. 重启电脑,进入正常模式,OK啦!
     
    关于这个问题,好像微软也有文档纪录,说是windows后台打印作业的问题...
    11/9/2006

    HD DVD技术概要

    随着HDTV(高清电视)广播在北美和日本的不断普及,以及2006年足球世界杯在欧洲以及世界其它地方给高清(High Definition)带来的推动,我们(DVD论坛)认为,现在是时候来要引入与高清对应的HD DVD了。因为随着屏幕尺寸的增大,标清(Standard Definition)视频的缺陷已经暴露无遗,以前还可以接受的东西似乎突然之间变得不能那么让人容忍了。一份针对消费者的研究表明,人们对图像质量的感观体验与观看的距离以及屏幕的尺寸直接相关。在屏幕尺寸超过36英寸的情况下,对标清视频质量的评估已经趋近于“差”;而HDTV即使在屏幕尺寸达到甚至超过60英寸的情况下,其图像质量也仍然被认为是“好”的。随着大屏幕电视的价格逐渐落入人们可以接受的范围,越来越多的大屏幕电视进入了普通消费者的家庭。HD DVD作为一种包装形式的媒体,恰好能够满足公众对高质量的HDTV内容的需求。另外,宽带和交互式电视的普及,也让人们对包装式媒体在交互性增强方面寄予了更高的期望。(译注:相比于传统的DVD,HD DVD确实在交互性方面有了极大的提高!)
     
    DVD论坛——一个自DVD格式诞生以来一直致力于制定DVD工业标准的组织——已经跟设备生产厂商和大型电影制片方广泛开展了合作,希望采用一种新的光盘(介质和格式)来完美地满足消费者家庭娱乐市场和PC电脑应用的需要。本文对HD DVD的主要技术特性作了一个总结;更进一步的信息,请访问DVD论坛的网站:www.dvdforum.org
     
    完整版,请见:
    10/15/2006

    如何启动“Microsoft File Transfer Manager”

    从MSDN下载东西的时候可能会*自动*启用“Microsoft File Transfer Manager”。这是微软提供的一个下载软件,支持断点续传,这一点在下载大文件的时候特别有意义。但是,对于以前下载了一半的文件,如何在以后*手工*启动这个下载软件让它继续下载呢?
    通过任务管理器,我发现微软的这个下载软件执行文件为TransferMgr.exe。OK,到硬盘上去搜索...结果,居然没有找到这个文件!可能TransferMgr.exe被作为系统文件隐藏起来了吧。于是到网上去找答案,搜到了如下的信息:
     
    Open a command window (Start, Run and type cmd or command depending on version of Windows)
    Change Directory to %SystemRoot%\Downloaded Program Files\
    Type TransferMgr.exe <enter>
     
    假设你的系统装在C盘,并且已经切换到C盘的控制台窗口,接着依次运行如下命令行就OK啦~
    cd \
    cd windows
    cd "downloaded program files"
    transfermgr
    9/4/2006

    [ZT]线程本地存储(Thread Local Storage, TLS)

    在多线程编程中, 同一个变量, 如果要让多个线程共享访问, 那么这个变量可以使用关键字volatile进行声明; 那么如果一个变量不想使多个线程共享访问, 那么该怎么办呢? 呵呵, 这个办法就是TLS, 线程本地存储. 它的使用非常之简单, 只要对变量的声明使用__declspec(thread)就OK了. 下面我来举一个例子, 结合注释, 相信大家马上就能知道其”奥秘”了.
     
    #include "stdafx.h"
    #include <stdio.h>
    __declspec(thread) int g_nData = 0; //这就是两个线程都要访问的变量
     
    DWORD WINAPI ThreadProc(LPVOID lpParameter)
    {
        g_nData = 5;
        //辅线程睡眠100ms, 保证主线程的g_nData = 10; 语句执行成功
        Sleep(100);
        char szMsg[40] = {0};
        sprintf(szMsg, "Auxi thread, g_nData: %d", g_nData);
        MessageBox(NULL, szMsg, "AuxiThread", MB_ICONINFORMATION);
        return 0;
    }
     
    int APIENTRY WinMain(HINSTANCE hInstance,
                         HINSTANCE hPrevInstance,
                         LPSTR     lpCmdLine,
                         int       nCmdShow)
    {
        // TODO: Place code here.
        DWORD dwId;
        //创建线程, 并立即启动它
        HANDLE hThread = CreateThread(NULL, 1024, ThreadProc, NULL, 0, &dwId);
        assert(hThread);
        //主线程睡50ms, 保证辅线程的g_nData = 5; 语句执行成功
        Sleep(50);
        g_nData = 10;
        char szMsg[40] = {0};
        sprintf(szMsg, "Result: %d", g_nData);
        MessageBox(NULL, szMsg, "MainThread", MB_ICONINFORMATION);
        return 0;
    }
     
    大家自己编译运行这个程序就会发现, 如果不使用TLS, 那么结果都是10; 如果使用TLS, 那么主, 助线程的结果将各不影响. 这下你该知道TLS是怎么回事了吧.
    当然, 更复杂的TLS, 就会需要用到Windows TLS的API: TlsAlloc, TlsFree, TlsSetValue, TlsGetValue了; 进一步还需要同步互斥等等.
    8/18/2006

    回味硬件技术的进步给软件带来的影响

    注:本文即将刊载于《程序员》2006年第9期。

    对于一台计算机来说,硬件是“经济基础”,软件则是“上层建筑”。于是,硬件与软件之间的关系必然是:矛盾的,但又辩证统一的。软件是硬件为用户提供服务的窗口,而硬件对软件的功能提供了基础的支持、以及性能上的保障。硬件决定了软件,而软件也会反作用于硬件(有时候甚至是一种制约)。硬件与软件之间息息相关,相互依存,相互渗透,最终能够达到共同繁荣。

    硬件技术在不断进步,而且它的进步往往还具有革命性!由于“摩尔定律”的客观存在,每一次硬件技术的变革都是那么的令人期待。它推动着计算机工业不断地向前发展,给软件业也带来了深远的影响。因此,本文试图通过回顾计算机硬件在存储容量、CPU主频、CPU指令集、总线带宽、显卡性能、网络带宽等方面的进步,来展示硬件对软件的“影响力”。应对扑面而来的多核时代,你做好准备了吗?

    存储容量

    每台计算机都有它的存储设备,或是内置的,或是外置的。最常见的应该是硬盘了。你用过只有10MB的硬盘吗?我猜你没有那么“幸运”吧!那你还记得最早用过的硬盘容量是多少吗?回忆一下吧!

    我的第一份工作是开发数字视频监控系统。这个产品跟硬盘有很大关联,也时常被人称作为 “硬盘录像机”。它的大致功能为:前端从摄像头采集视频图像,实时显示在电脑终端以供监视,并且支持将数据同步存档到硬盘上。这个产品被看作是银行、物业、超市等安全应用领域已有模拟监控系统(数据记录在磁带上)的一种替代品而被大力倡导。但是,当时主流的硬盘容量是40GB。我们的第一代产品图像压缩算法采用的是JPEG,假设图像分辨率是320 x 240,压缩成JPEG后单幅图像的大小为15KB,如果每秒钟采集15帧的话,1秒钟保存到硬盘上的数据就要达到225KB。即使系统中挂了两个40GB的硬盘,那也只能持续存储大概4天的数据。这跟银行的要求(至少保存1个月的数据)其实相差很远。存储容量在当时是限制了这个产品的推广和应用。

    硬件资源受到了限制,那就只能在软件上下功夫了。我们先是优化算法,对采集到的图像进行差别判断,仅保存前后变动较大的图像;后来索性放弃JPEG,采用了MPEG-1压缩算法。假设MPEG-1码流的比特率是1Mbps(接近VCD效果),保存1小时的数据大小为450MB,如果系统的存储容量仍然是80GB,那就能保存将近8天的数据。如果可以略微牺牲一点图像质量(即降低码流的比特率),再配合一些存储容量扩充技术(比如使用磁盘阵列),系统就能存储更多时间的数据,也就使这套系统接近了实用阶段。再后来采用压缩率更高的MPEG-4算法,进一步把这种数字视频监控系统推向了实际的应用。

    存储容量的不足推迟了数字视频监控产品的广泛应用,但另一方面也催化了多媒体压缩编码算法的进步。如今给你一个320GB的硬盘,你也不要太惊讶。一个系统挂上两个硬盘就有640GB了,即使还是1MbpsMPEG-1码流,保存1个月的数据也是绰绰有余。在存储容量充裕的条件下,监控系统软件开发的重点也从千方百计减少录像的数据量,转变到增强软件界面的友好性、易操作性、以及功能的完整性等方面。

    CPU主频

    CPUCentral Processing Unit的缩写,意为中央处理器。人们常常形容它是计算机的“心脏”。1978年,Intel公司推出了首枚16位的微处理器8086,当时的时钟频率仅为4.77MHz。经过将近30年的发展,CPU主频得到了大幅的提升,现在已经可以达到4GHzCPU运算得越来越快了,跑在它上面的软件也显得越来越轻松了。

    我供职的前一家公司是专门从事多媒体应用软件开发的。该公司创建于1998年,以MPEG编解码速度快见称。大家知道,多媒体软件需要处理大量的数据,在CPU速度不够快的时候,软件工作的效率就可以呈现出一种竞争力。因为编码速度快,就可以做到音视频的实时采集、编码、存储;这一点很多竞争对手都做不到。因此这个公司在刚开始的那么几年过得还不错。但随着CPU主频的不断提升,这种竞争优势已经日趋不明显。竞争对手的编解码器虽然慢一点,但在高速的CPU逐渐成为电脑的主流配置时,一些实时的应用也开始可以做了。这个时候,用户更关心的是软件本身实现的功能,以及通过软件产出的作品的质量(而不会太在意这个作品的制作过程需要花费多少相差不大的时间)。那些以软件效率高为主要竞争力的公司是应该有些危机感了!效率高似乎应该是硬件的专利才对。

    微软的Windows Media编解码器是另外的一个例子。它的编解码器效率一直很低,在配置较低的机器上跑,CPU几乎总是100%,还会产生丢帧。但微软似乎并不着急,也无意于花大力气去提高它的编解码器。看来微软对硬件技术的发展趋势把握得非常好。现在配置以高主频的CPUWindows Media编解码器就能满足绝大部分应用的需要,制作/呈现出来的媒体质量也相当令人满意。更何况,Windows Media编解码器是完全免费的!

    CPU指令集

    CPU依靠指令来计算和控制系统。每款CPU在设计的时候就规定了一系列与其硬件电路相配合的指令系统。指令集可分为复杂指令集和精简指令集两部分。而从具体应用来看,还有另外一个叫“扩展指令集”的分类,如Intel公司的MMXSSESSE2SSE3SSE4AMD公司的3D Now!等。这些扩展指令集定义了新的数据和指令格式,能够大大提高CPU某方面的数据处理能力,但必须要有软件的支持。

    其实,扩展指令集大都是为增强CPU对多媒体、图形图像的处理能力而设计的。因为多媒体应用程序往往要处理海量的数据,对效率有比较苛刻的要求。CPU通过扩展指令集给出了优化方案,剩下的就看软件如何来配合了。现在的开源项目很多,随便去看一两个音视频编解码相关的,汇编优化的代码随处可见。在一些多媒体应用软件中,如果要实现图像叠加、尺寸缩放、效果处理等功能,如果没有算法/代码优化,效率几乎不可想象。软件在CPU的扩展指令集上真是受益匪浅!

    总线带宽

    北京时间2005425日晚间,微软在西雅图WinHEC大会上正式推出了x64操作系统。这是一款什么样的操作系统呢?它又有如何的重要意义呢?

    在计算机系统中,各个功能部件都是通过总线来交换数据的,总线的带宽对系统性能有着极大的影响。计算机历史上经历了8位计算到16位计算、从16位计算到32位计算的两次飞跃。现在正在推进的就是第三次飞跃——从32位计算到64位计算。全球最重要的处理器供应商包括:AMDHPIBMIntelMotorolaSun无一例外都在推动着64位计算。

    目前的X86结构在32位寻址时最大空间只能是4GB,这对于很多大型数据库应用、数字/三维/视频内容的创作,还有如CAD/CAM等需要将现实世界建模运算的软件来说有点捉襟见肘。这些高性能计算领域都有大量的内存需求。而64位平台的寻址能力达到了180亿GB,这在未来很长一段时间内都可以解决高端应用中存储器寻址的瓶颈问题。

    Windows XP Professional x64 Edition目前来说是新一代应用程序的最佳系统平台。大多数Windows兼容的32位应用程序在这个x64平台上仍将能正常运行。Win64 APIWin32 API大致相同,只在必要处进行了修改,使它们可以反映其运行平台的精度。这样设计的目的是:简化编程,并缩短软件开发人员编写64Windows代码的学习曲线;同时也保持了微软对开发者支持比较好的一向作风。但无论怎么说,64位平台和32位平台毕竟不一样了,面对64位计算的大趋势,我们应该有所准备!

    显卡性能

    现在的家用电脑常被称作为多媒体电脑。电脑不仅可以从事计算任务,还可以作为媒体娱乐中心,为人们提供丰富的视听享受。很多人都将声卡或CDROM作为PC进入多媒体时代的标志,然而真正吸引大量电脑用户的却是PC游戏。作为决定游戏效果的关键因素,显卡将一代又一代玩家带入一个个梦幻般的游戏世界。显卡几乎为游戏而生!

    从最初简单的显示功能到如今疯狂的3D加速,显卡的面貌可谓沧海桑田。无论是速度、画质,还是接口类型、视频功能,显卡在近十年里的革新甚至已经可以超越CPU。推陈出新的游戏软件在满足玩家的同时,对显卡的性能不断提出新的要求。而随着高性能显卡的发布,又会催生一大批令玩家沉迷的新游戏。PC游戏市场日渐繁荣,甚至形成了一个蓬勃发展的产业。

    除了游戏软件之外,在电脑上进行媒体播放也很依赖显卡的性能。最初在电脑上播放DVD,由于是完全的软件解码,占用CPU资源太多,播放出来的画面很不流畅。随后,微软发布了一套DXVA 视频加速接口。使用这个接口,软件播放器可以将一部分解码工作交给显卡去做,让显卡分担一部分的CPU负荷。于是,软件播放器的性能得到了大幅的提升。伴随着显卡的发展,Windows上的显示技术也得到了长足的发展,从最初的GDIDirectDrawDirect3D,无一不是在发挥着显卡的极致性能,让软件呈现给用户极致的体验。

    网络带宽

    21世纪了,如果你使用电脑的方式还停留在单机模式,那你就落伍了。如今已是如火如荼的网络时代!网络是信息共享最有效的途径。除了工作时经常使用的局域网之外,影响人们工作和生活更多的还属互联网。早期的互联网上出现的只有文字、图像、声音等简单信息,后来逐渐出现了视频(有个很热的概念叫作“流媒体”)。但这里有个很严重的问题,那就是视频数据对时间很敏感、而且数据量非常之大,而可利用的网络带宽却非常之有限,结果流媒体很难得到完美的呈现。

    有限的网络带宽似乎给了一些软件公司难得的发展契机(其中成就最为辉煌的当属RealNetworks)。它们一方面通过提高编解码技术,在保证多媒体内容质量的前提下尽可能多地降低在网络上传输的数据量;另一方面大力发展网络通信技术,开发了RTPRTSPMMS等一系列专门针对实时性数据的网络传输/控制协议。成果是喜人的!流媒体也因此在远程教育、视频点播、视频会议等领域得到了大量的应用。

    即便如此,互联网还有很大的发展潜力。随着网络基础设施的不断改善、信息高速公路的逐步建成,以及电信、电视、计算机“三网融合”趋势的加强,未来的互联网将能够融合现今所有的通信业务,并能培育出更多的新业务,给整个信息技术产业带来一场革命。你看到其中蕴藏的机遇了吗?

    多核时代

    在硬件技术发展的大舞台上,CPU似乎总是主角。Intel公司一直是CPU的霸主,它提供了世界上主频最高的CPU,从MHz量级到1GHz2GHz3GHz,最高达到4GHz,一路领先。在这一过程中,AMD公司只在1GHz时领先过那么一小会儿。但CPU主频到了4GHz似乎已经是一个极限,微处理器厂商不再单纯去提高频率,而纷纷推出了双核乃至多核的架构。好像就在一夜之间,多核来到了我们身边。从此一台电脑可以拥有多颗奔腾的芯,那是多么的激动人心啊!

    像以往硬件技术的进步总会对软件以及相关产业产生或多或少的影响一样,多核CPU带来的震撼可能更具有划时代的意义。但采用多核CPU是否一定意味着跑在它上面的软件效率得到成倍的提升呢?未必!如何在两个以上的处理器之间合理地调配资源,目前尚未有成熟高效的算法。从目前来看,软件仍然是个“软肋”;由于软件的限制,多核的优势很难被充分发挥。而且这种充分发挥只有在特定的条件下才会起效,当它面对的是流水线比较长、或者两种互不交叉的运算时,多核的智商可能会低得和单核一样。多核给软件带来了很多亟待解决的课题,它可能还会颠覆现有的编程模式。作为软件开发人员,是时候做些准备了!

    3/9/2006

    Windows密码的自动管理

    办公室里我有两台机器,一台台式机登录在域里面,另一台笔记本不在这个域里面。当我想通过笔记本访问一台在域里面的机器时,会弹出一个要求我登录的对话框;于是我输入我在这个域里面的用户名和密码,一切OK。登录时还有一个选项,让Windows自动保存密码。如果选择这个选项,下次再访问这台域里的机器时,就不用重新输入用户名、密码了,很方便的说~
    但是,如果有一天你改了用户名的密码。那么,这时访问以前访问过的域里的机器时,就会被直接拒绝(不会弹出要求你登录的对话框)。Windows可能使用了以前保存过的用户名、密码,但当密码改动之后没有同步更新... Windows的Bug???
    现在来讲一下解决方法。打开控制面板,进入User Accounts设置界面,在Advanced标签页中,点击Manage Passwords这个按钮,然后在弹出对话框中找到你要访问的机器名,把它删了..... 这样,当你下次访问这台域里的机器时,会要求你重新输入用户名、密码!
    1/10/2006

    卸载IE 7 Beta版

    最近一直在跟JavaScript打交道,想要装一个script调试器,便于开发工作。在微软的网站上下载了Microsoft Script Debugger,但是死活装不上我的机器。因为我的机器装有IE 7 Beta 1,我开始怀疑它是罪魁祸首,于是想把它卸载掉!(IE 7 Beta用了有一段时间了,总体上除了集成了搜索框、增加了Tab、反钓鱼等功能外,也没啥令人惊喜的地方!删了它也罢!)
     
    尝试1:使用控制面板的“添加/删除程序”,在系统组件里面将Internet Explorer勾掉,试图删除这个系统组件,然后重启机器;再次进入控制面板“添加/删除程序”,在系统组件里面将Internet Explorer勾上,重装这个系统组件。结果,重装好后运行IE,仍然是IE 7。失败!
     
    尝试2:在MSDN找了一张IE 6的安装盘,运行它,结果安装程序检测到系统中已经安装了更新版本的IE,不让我装IE 6。Faint!!!
     
    无奈之下,我在MSN上求助,名字后面写上“怎么把IE 7卸掉???”。很幸运,一位叫“Nico.Discipline.Dedication.Desire”的朋友给我提供了解决方案:
    1.“显示更新”法
       进入“添加/删除程序”窗口,由于IE是在安装系统时当作系统组件安装的,因此我们找不到任何IE删除选项,而在“添加/删除Windows组件”中仅有卸载整个IE,而非IE 7。其实我们只要在“添加/删除程序”窗口中勾选“显示更新”选项即可看到IE 7 beta 1了(图6)。
    2.借助卸载工具
       虽然windows自带的程序卸载工具会把IE 7也当作了系统组件,但是其他第三方工具软件会把IE 7当作一个独立的软件,因此我们完全可以借助这些工具来轻松卸载IE 7。这里我们以“完美卸载”为例:安装完毕后,运行“完美卸载”,然后选择“软件卸载”,在弹出的窗口中找到IE 7 beta 1,然后点击“卸载软件”按钮即可(图7)。
     
    我尝试了他列出的第1种方法(勾选“显示更新”),成功了!多谢这位朋友~ 随后,Microsoft Script Debugger也装上去了,哈哈~
    12/5/2005

    什么是Web 2.0?

    Web 2.0?!这个概念好像被炒得越来越热哦~ 那什么是Web 2.0呢?Web 2.0简单来说,其实就是下一代的互联网应用标准;它最初是由O'Reilly媒体公司总裁兼CEO提姆·奥莱理提出来的。Web2.0的一个关键原则是用户越多,服务越好!更多关于Web 2.0的介绍,推荐大家看一看下面的几篇文章:http://www.donews.com/Content/200511/a9f1b26851114b4cabb16d75cd129c17.shtm
    http://it.sohu.com/20051021/n240578182.shtml
    10/13/2005

    Kill "信使服务"

    你有没有这样的经历:在上网或在电脑前工作的时候,突然跳出一个对话框“信使服务”。好讨厌吧!不过,我们有办法关掉它,方法是:进入 控制面板(Control Panel) | 管理工具(Administrative Tools) | 组件服务(Component Services),双击这个组件服务,在弹出的对话框中左边选中Services,然后在右边找到Messager并双击它进入属性对话框,随后就在General页中将Service status改成Stopped、将Startup type改成Disable。OK啦,就这么简单!
    8/11/2005

    What's S/PDIF

    S/PDIF (Sony/Philips Digital Interface) is a standard audio transfer file format. It is usually found on digital audio equipment such as a DAT (Digital Audio Tape) machine or audio processing device. It allows the transfer of audio from one file to another without the conversion to and from an analog format, which could degrade the signal quality. The most common connector used with an S/PDIF interface is the RCA connector, the same one used for consumer audio products. An optical connector is also sometimes used.
     
    S/PDIF是Sony / Philips Digital Interface Format的缩写它所代表的是数字讯号的传输,顾名思义是由Sony与Philips两大公司携手合作所制定的,它推出的目的是为了更有效的提升数字音源讯号传输速率,以确保声音数据及资料的准确性与同步性。目前S/PDIF传输接口,主要有同轴电缆(Coaxial Cable)与光纤(Optical Fiber)两种。 托普所推出的天梭系列TPNB2001产品系使用光纤接口的 S/PDIF 输出。TPNB2001的S/PDIF 输出端共享耳机输出端。使用者可以在使用 Windows Media Player 7.00.00.1442之后的版本播放音乐 CD 的同时透过S/PDIF光纤接口将音乐录至诸如 MD 等具有S/PDIF输入端的音响组合。目前TPNB2001 可以在 Windows 98SE, Windows ME 及 Windows 2000 Professional 版的作业环境下使用这项功能。
    3/15/2005

    “数字家庭”离我们究竟有多远?

    2003年6月以来,随着英特尔、IBM和微软等联合发起“数字家庭工作组DHWG”,联想、长城、TCL、康佳和海信成立“信息设备资源共享协同服务标准化IGRS工作组”,数字家庭逐步走到台前,贴有“闪联”标志的产品离最终客户的日子已经指日可待了。那么,“数字家庭”的明天到底会怎样?它离我们究竟有多远呢?中国企业将如何面对呢?

    2/23/2005

    [转]3G是什么?3G能带来多少机会?

    3G是英文3rd Generation的缩写,指第三代移动通信技术。相对第一代模拟制式手机(1G)和第二代GSM、TDMA等数字手机(2G),第三代手机一般地讲,是指将无线通信与国际互联网等多媒体通信结合的新一代移动通信系统。它能够处理图像、音乐、视频流等多种媒体形式,提供包括网页浏览、电话会议、电子商务等多种信息服务。为了提供这种服务,无线网络必须能够支持不同的数据传输速度,也就是说在室内、室外和行车的环境中能够分别支持至少2Mbps(兆字节/每秒)、384kbps(千字节/每秒)以及144kbps的传输速度。

    经过了漫长的等待期以后,3G的梦想正在一步步地向现实逼近,移动开发者们和移动应用的受益者们开始越来越多地谈论3G将带来的机会和价值。第三代移动通信技术能够处理图像、音乐、视频流等多种媒体形式,提供包括网页浏览、电话会议、电子商务等多种信息服务。普及3G技术,不仅手机话费将明显降低,而且类似于网络电视、可视通话等原来公众无法享受到的业务,也将不再局限于少数人使用。这将使得IT厂商向3G产业方向转型,而受这种转型影响最大的无疑将是软件业。业内专家对此有一个绝妙的比喻,在通讯业数字化的进程中,中国产生了一大批类似于华为这样的企业,而在广电业的数字化进程中,也将产生另一个“软件华为”。

    机会总是属于有准备的人,作为程度员的你,又想借3G这股东风干些什么呢?

    2/16/2005

    什么是RSS?

    RSS是英文Really Simple Syndication(简易信息聚合)。 RSS是基于XML技术的互联网内容发布和集成技术。90年代末就由Netscape (网景公司) 提出,并做进了他们当时红极一时的互联网浏览器Navigator里。当时称为“推”技术。 但当时在商业应用上并不成功。主要原因是当时互联网上的内容少得可怜。 但随着Blog文化的推广,以及Blog广泛采用RSS作为信息交流技术,从而RSS的内容源一下子大为丰富。 于是,Blog文化在RSS技术的支持下得到普及,而RSS技术随着Blog文化的普及又得到不断地普及。

    网站主可以利用PHP、Coldfusion、ASP或其它动态网站编程技术读取RSS页面的信息,将新闻整合到自己的网站。

    网络用户可以在客户端借助于支持RSS 的新闻聚合工具软件(例如Rssowl),在不打开网站内容页面的情况下阅读支持RSS输出的网站内容。可见,网站提供RSS输出,有利于让用户发现网站内容的更新。在高速 高质高效成为主流呼声的互联网时代,RSS无疑推动了网上信息的传播,提出了另一种看世界的方式。

    1/27/2005

    音视频同步-时间戳

    媒体内容在播放时,最令人头痛的就是音视频不同步。从技术上来说,解决音视频同步问题的最佳方案就是时间戳:首先选择一个参考时钟(要求参考时钟上的时间是线性递增的);生成数据流时依据参考时钟上的时间给每个数据块都打上时间戳(一般包括开始时间和结束时间);在播放时,读取数据块上的时间戳,同时参考当前参考时钟上的时间来安排播放(如果数据块的开始时间大于当前参考时钟上的时间,则不急于播放该数据块,直到参考时钟达到数据块的开始时间;如果数据块的开始时间小于当前参考时钟上的时间,则“尽快”播放这块数据或者索性将这块数据“丢弃”,以使播放进度追上参考时钟)。

     avsync

      图2.8 解决音视频同步问题的时间戳方案

      可见,避免音视频不同步现象有两个关键——一是在生成数据流时要上正确的时间戳。如果数据块上打的时间戳本身就有问题,那么播放时再怎么调整也于事无补。如图2.8,视频流内容是从0s开始的,假设10s时有人开始说话,要求配上音频流,那么音频流的起始时间应该是10s,如果时间戳从0s或其它时间开始打,则这个混合的音视频流在时间同步上本身就出了问题。打时间戳时,视频流和音频流都是参考参考时钟的时间,而数据流之间不会发生参考关系;也就是说,视频流和音频流是通过一个中立的第三方(也就是参考时钟)来实现同步的。第二个关键的地方,就是在播放时基于时间戳对数据流的控制,也就是对数据块早到或晚到采取不同的处理方法。图2.8中,参考时钟时间在0-10s内播放视频流内容过程中,即使收到了音频流数据块也不能立即播放它,而必须等到参考时钟的时间达到10s之后才可以,否则就会引起音视频不同步问题。

    基于时间戳的播放过程中,仅仅对早到的或晚到的数据块进行等待或快速处理,有时候是不够的。如果想要更加主动并且有效地调节播放性能,需要引入一个反馈机制,也就是要将当前数据流速度太快或太慢的状态反馈给“源”,让源去放慢或加快数据流的速度。熟悉DirectShow的读者一定知道,DirectShow中的质量控制(Quality Control)就是这么一个反馈机制。DirectShow对于音视频同步的解决方案是相当出色的。但WMF SDK在播放时只负责将ASF数据流读出并解码,而并不负责音视频内容的最终呈现,所以它也缺少这样的一个反馈机制。

    为了更好地理解基于时间戳的音视频同步方案,下面举一个生活中的例子。假设你和你的一个朋友约好了今天18:00在沪上广场见面,然后一起吃饭,再去打游戏。实际上,这个18:00就是你和你朋友保持同步的一个时间点。结果你17:50就到了沪上广场,那么你必须等你的朋友。10分钟过后,你的朋友还没有到,这时他打来电话说有事耽搁了,要晚一点才能到。你没办法,因为你已经在旁边的餐厅预订了位置,如果不马上赶过去,预订就会被取消,于是你告诉你的朋友直接到餐厅碰头吧,要他加快点。于是在餐厅将来的某个时间点就成为你和你朋友的又一个同步点。虽然具体时间不定(要看你朋友赶过来的速度),但这样努力的方向是对的,你和你朋友肯定能在餐厅见到面。结果呢?你朋友终于在18:30赶过来了,你们最终“同步”了。吃完饭19:30了,你临时有事要处理一下,于是跟你朋友再约好了20:00在附近的一家游戏厅碰头。你们又不同步了,但在游戏厅将来的某个时间点你们还是会再次同步的。

    悟出什么道理了没有?其实,同步是一个动态的过程,是一个有人等待、有人追赶的过程。同步只是暂时的,而不同步才是常态。人们总是在同步的水平线上振荡波动,但不会偏离这条基线太远。

    12/29/2004

    关于写文件的两套函数

    至少有两套函数可供选择:C-Runtime的fopen, fread, fwriter和Platform SDK的CreateFile,ReadFile,WriteFile。

    我在写Windows Media的应用程序时,需要将媒体数据dump到一个文件,刚开始用的是c-runtime函数,结果发现最后的文件数据总是多出来一点,文件也不能用Media Player播放。后来我改用platform sdk的几个函数,一切正常了。不知道这两套函数在内部实现上有什么区别?