Agile
-
WMENC_SOURCE_TYPE=6?
2007-02-13
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 专业人士必备的书籍和网站列表和Encoder
2007-01-17
Java 专业人士必备的书籍和网站列表 ,IBM developerWorks上的一个文章,其中列举的都是Java开发方面重量级的书。
不同以下几本没有读过:
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,晕死我了,希望不要让我失望。
-
SAFE_DELETE C++的指针简直让我无法适应
2006-12-12
最近公司有一个项目,要用到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







