最后分析一下,采集的部分,对于采集,有多种方式,当然例子都是模拟采集,直接从本地文件读取数据,
关键在于这里,采集的部分读取到ring buffer里面,这里就是为了同步!
采集的不管从哪里拿数据,形式都是次要的。
最后稍微讲下,如何实现api的统一性,给别人调用!
这里就需要用到回调函数的概念!
Callback最本质的特征包括两点:注册和触发
C++中如何将类成员函数作为回调函数使用,必须是静态方法吗?
必须是静态成员函数或者全局函数来实现回调函数,原因是普通的C++成员函数都隐含了一个传递函数作为参数,即this指针,C++通过传递this指针给成员函数从而实现函数可以访问C++的数据成员。由于this指针的原因,使得一个普通成员函数作为回调函数时就会因为隐含的this指针问题使得函数参数个数不匹配,从而导致回调函数编译失败。
下面举一个例子来说明下:
首先声明下,
void register_open_thread_func( FuncStartOrClosethread Funpenthread ){
m_FunOpenthread = Funopenthread;
}
void register_close_thread_func( FuncStartOrClosethread Funclosethread){
m_FunClosethread = Funcclosethread;
}
void open_cap(){
m_FunOpenthread();
}
void close_cap(){
m_FunClosethread();
}
然后需要定义基本的全部静态
typedef int ( *FuncStartOrClosethread )();
最后定义即可:
FuncStartOrClosethread m_FunOpenthread;
FuncStartOrClosethread m_FunClosethread;
这样一个回调函数就实现了,简单的c语言实现!
使用的话,在main函数如下:
register_open_thread_func(true_cap)
register_close_thread_func(close_cap)
这样就隔离了!可以在true_cap和close_cap里面做真正的事情!
那么采集的时机在什么时候,
前面分析rtsp交互的时候,收到play参数的时候,说明可以采集数据
这里调用采集的回调api就ok了!
整个采集的逻辑比较简单,至于具体的实现,不再讨论!
还有如果要采取binder形式拿数据的话,这时候,启动一个binder server端,
然后坐等收数据就行了!