欢迎来到天天文库
浏览记录
ID:40527807
大小:41.50 KB
页数:7页
时间:2019-08-04
《directshow学习笔记》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、定义自己的filter,实现编码和解码。1.字符叠加Filter之功能分析总体需求:在视频流指定的一个时间段内叠加一段字符,要求能够做到实时叠加。字符的内容、字体类型、大小、颜色、叠加的位置、存在的时间都能够定制,普遍支持RGB各种格式输入。另外,除了支持静态字符叠加外,还要求支持其他效果的字符(包括滚动字幕,系统时间等)叠加,并且系统设计的扩展性良好。功能单一化:字符叠加可以在一个filter中实现。选择一种filter模型:这个filter同时有输入和输出(即在输入的视频帧上叠加完字符后再输出到下一级filter),因此我们的filter是一个TransformFilte
2、r。由于输入和输出的媒体类型一致,而且输入和输出sample的数据大小不会变化,所以我们可以采用“就地”处理的transformFilter。定义输入和输出我们的filter需要一个输入Pin和一个输出Pin,输入Pin支持的媒体类型有RGB32、RGB24、RGB565、RGB555等,并且输出Pin上的媒体类型与输入Pin保持一致。接口定义接口方法应该包括设置字符的内容,设置字体的各种属性,选择字体的叠加效果,设置叠加位置,设置字符存在的时间段等。其他一些特殊要求Filter处理的sample是一一对应的,而且内部不需要另外的使用线程。这是一个标准的TransformFi
3、lter。当我们要写一个sourceFilter,并且要将产生的数据“推”出去时,我们一般选择Csource,我们的Filter接收输入数据,经过一定的处理后要再输出数据,我们一般选择CtransformFilter(如果可以“就地”处理就选择CtransInPlaceFilter)。如果我们的Filter同时有输入和输出,而且它的输入Pin上需要自己“拉”数据,则我们选择CbaseFilter,而在输入Pin上使用工具类CpullPin;当我们的Filter接收输入数据后不再需要输出,我们一般选择CbaseFilter。Filter的父类确定了,一般Pin的父类也就相应地确
4、定了,DirectshowSDK提供的这些具体应用的Filter子类都提供了相应的Pin类。我们可以从特殊的Pin类中派生出我们自己的Pin类。“字符叠加Filter”选择CtransInPlaceFilter作为我们Filter的父类,而且我们不用重新实现自己的Pin类。Filter只是一个应用框架,一个能够支持“输入->内部处理->输出”的典型过程框架的应用框架,最重要的是“内部处理”部分。将应用框架和应用逻辑分离,以设计一个结构清晰,扩展性良好的Filter项目。Filter框架是指完成Filter功能的一个必要的操作函数集。Filter类的使用方法,包括实现一些必须的
5、纯虚函数,可选实现的虚函数等,以完成输入和输出Pin上的媒体类型检查,决定Sample内存大小等。另外,我们在Filter上可能还要将一些状态信息设置给应用逻辑控制对象,在Filter的状态转换的同时调用控制对象相应的函数(用于初始化或反初始化),以及在数据处理时调用控制对象的数据处理函数等。应用逻辑是指对输入数据进行处理的一套控制策略。至于数据是如何输入的,处理完后又是如何输出的,这些问题都由Filter框架负责。应用逻辑需要关心的,更多的是数据处理的算法实现,效率优化等问题。应用逻辑控制对象一般以Filter的一个复合成员对象的形式出现。以“字符叠加Filter”为例,我
6、们定义一个Filter类为CfilterTitleOverlay,它从CtransInPlaceFilter类派生而来,再定义一个应用逻辑控制类为CoverlayController,作为Filter定义自己的filter,实现编码和解码。1.字符叠加Filter之功能分析总体需求:在视频流指定的一个时间段内叠加一段字符,要求能够做到实时叠加。字符的内容、字体类型、大小、颜色、叠加的位置、存在的时间都能够定制,普遍支持RGB各种格式输入。另外,除了支持静态字符叠加外,还要求支持其他效果的字符(包括滚动字幕,系统时间等)叠加,并且系统设计的扩展性良好。功能单一化:字符叠加可以在
7、一个filter中实现。选择一种filter模型:这个filter同时有输入和输出(即在输入的视频帧上叠加完字符后再输出到下一级filter),因此我们的filter是一个TransformFilter。由于输入和输出的媒体类型一致,而且输入和输出sample的数据大小不会变化,所以我们可以采用“就地”处理的transformFilter。定义输入和输出我们的filter需要一个输入Pin和一个输出Pin,输入Pin支持的媒体类型有RGB32、RGB24、RGB565、RGB555等,并且输出Pin上的
此文档下载收益归作者所有