• WMENC_SOURCE_TYPE=6?

    上周这个问题困扰了我好几个小时,今天有时间记下来。

    上周修改公司的一个直播编码器(基于Windows Media Encoder SDK开发),有一个功能是列出系统中所有的可用视频/音频设备。我们使用了种叫osprey的采集卡,总是无法区分出是视频还是音频设备。研究了一下sdk的api,发现一个函数:

    HRESULT get_MediaType( WMENC_SOURCE_TYPE* penumMediaType ); 

    调用此方法应该就可以得到当前的设备是哪种类型,好不高兴,试验了一下,还是没有检测出我想要的设备。

    不得不Debug 了,结果很是奇怪,返回的值竟然是6,再看WMENC_SOURCE_TYPE的定义:

    typedef enum WMENC_SOURCE_TYPE{

    WMENC_AUDIO = 1, WMENC_VIDEO = 2, WMENC_SCRIPT = 4, WMENC_FILETRANSFER = 8

    }; 

    只有这四种值,那6是哪来的?经验判断,估计6是WMENC_VIDEO和WMENC_SCRIPT的“或 ”,测试一下果然得到了结果。

     虽然结果正确了,还是不放心,刚才又上Google找到一个文章,正在是类似的问题:http://www.tech-archive.net/Archive/Media/microsoft.public.windowsmedia.encoder/2005-01/0213.html

    基本上是这个结果了。

     今天又有需求了,要求做成类似Windows Encoder的那种,在播放时可以显示出进度条和音频的音量指示,晕,感觉自己像块砖一样,什么地方需要就到什么地方去,有时真是受不了了,就在这里发发牢骚先。

    越发喜欢Groovy了,强大,简单,最近又在项目中小试了一下,好使得很。

    过年了,还没有搞到票,郁闷啊,难道要到初一才能回吗?:(

    该死的票贩子,昨天去北站问了一下,一张票要1000块,原价可是连200都不到,飞机票也没有这么贵。

     

  • Java 专业人士必备的书籍和网站列表 ,IBM developerWorks上的一个文章,其中列举的都是Java开发方面重量级的书。

    不同以下几本没有读过:

    UML Distilled (Martin Fowler)

    Test-Driven Development: By Example (Kent Beck)

    Peopleware: Productive Projects and Teams (Tom DeMarco and Timothy Lister)

    应该还是不错的书,找机会读一读。

    公司的直播编码器已经完成了,正在测试中,由于已经完成了轮播和采集编码器,所以对Media Encode SDK也比较熟悉了,进度比较快。这是我目前做得真正的第一个给用户使用的Windows 应用程序,收获不少,期间遇到的问题主要有两个:

    视频编码时的预览的切换

    开始的时候,切换节目时,视频预览总是有时能切换过来,有时就不能,给人的感觉很不好。观察了一下Media Encoder的切换方式,感觉他好像是每次切换时,每个节目的预览框都对应一个“窗口”,照这个猜测,我把每个节目都预先生成两个CStatic,供切换使用,经过调试,切换还算流畅。

    另一个问题就是界面了,vc做起界面,对我来说,是非常的费劲,折腾来折腾去,也不好看,今天下午修改得总算看得过去了,先让频道的同事试用一下,等待反馈的消息,再进行修改。

    今天下午还遇到了一个更奇怪的

    S_OK,S_FALSE是一个陷井。

    先看它们的定义

    #define S_OK                                   ((HRESULT)0x00000000L)
    #define S_FALSE                                ((HRESULT)0x00000001L)

    这是两个用于判断返回值是否成功的宏:
    #define SUCCEEDED(Status) ((HRESULT)(Status) >= 0)
    #define FAILED(Status) ((HRESULT)(Status)<0)

    在用Encoder SDK编程时,大量使用了HRESULT作为返回值,因此我一般直接使用if(FAILED(hr))进行错误判断,我进了自己的陷井里。

    我定义有一个方法,当状态不正确时,我会返回S_FALSE,当时也没有看它们的定义,还是使用FAILDE(hr)进行返回值的检测,此时FAILED(S_OK)是返回false的,而不是我期望的true,结果导致程序马上崩溃。好在问题不大,多加一个判断就修正了。

    VC太复杂了,用了这段日子,只是用了一个皮毛,路途遥远啊。

    下面的工作本来是想做一些DMO组件,最想实现的就是在编码的过程中给视频自动增加logo或字幕,网络上这方面的资料也比较少,还没有找到详细的介绍,只好先自己摸索了。

    最近越发的找不到自己前进的方向了,希望能尽快调整过来,瞄准一个方向,努力奋斗。

    昨天买了一个SOA方面的书,刚开了一个开头,感觉还是web service,晕死我了,希望不要让我失望。

  • 最近公司有一个项目,要用到VC,临时找不到合适的人,就指派我先做,我现在才发现改别人的源代码是多么痛苦的事(特别对像我一直是纯JAVA程序员的人)指针从这里到那里,一个不小心就导致程序的内存访问违例,想了好多办法也不知道是从哪儿抛出的异常。

    如果是错误的使用了指针,那当删除它的时候,肯定会导致程序异常的,想了一个笨办法,每当要delete时,用下面的宏,如果出错了,就把它记录到日志中,并把指针的变量名也记下来,再顺着这个变量找回去,一般是会有所收获的(通常能找到哪个指针的使用有问题。)

    #define SAFE_DELETE(x) \
    do  \
    { \
    CString target=#x;\
    try{ \
     if(x != NULL){delete x; x = NULL;} \
    }catch(...){ClientLogger::log(" Release "+target+" error");}\
    }while(0)

  • 基础太差了

    2005-03-15

    前前后后的工作已经三年了快,第一年,写了一年的PHP,之后的两年写了两年的java,到现在也还在写。每次写java程序的时候总是感觉系统离我太远了,也感觉不到自己的基础竟是那么的差。这还得从昨天看<深入理解计算机系统>说起。

    在书中有一节讲的是内存的对齐,所用的编译器是gcc,有一个例子类似下面这个定义:

    struct s2{
    int i;
    int j;
    char c;
    } s_2;

    看到这个定义,以及后面的问题,我认为struct s2的大小是9字节,而书说是12个字节。经过上机一试,果然如此。那以前看过的资料不是有问题吗?

    在<UNIX高级环境编程>我找到了下面一段:

    (2) 读或写一个结构。例如,可以写作:
    struct {
    short count;
    long total;
    char name[N A M E S I Z E];
    } item;
    if (fwrite(&item, sizeof(item), 1, fp) != 1)
    err_sys("fwrite error");

    这和我以前看过的资料基本是一样的用法。可是由于c编译器会自动对struct所占的内存进行对齐,所以struct的内存映象可能不会是我们想象中的,例如struct s2 就占了12个字节(在C编译器默认打开对齐的时候),那么fwrite(&item, sizeof(item), 1, fp)写出的就不是9个字节,而是12个字节。这就会引起想不到的错误。

    由于对c语言的不熟,就带着这个问题问了一个朋友,他告诉我

    #pragma pack(push,1)
    struct s1{
    int i;
    int j;
    char c;
    } s_1;
    #pragma pack(pop)

    就可以强制编译器不近4或2字节对齐了,s1的大小就是9字节。

    经过这么一番折腾,认识到自己的基础很是不扎实,下定决心,把<深入理解计算机系统>看完,不能在这样下去了。

    相关blog:http://blogger.org.cn/blog/more.asp?name=hongrui&id=3701