admin管理员组文章数量:1664358
Pjsip的Conference会议桥,主要的功能是抽象media的输入输出为port,并把port中的PCM数据进行混音,已达到多方通话的混音功能。
对conference感兴趣的主要是两点:
- 怎么抽象port
- 怎么混音
conference的代码位置:pjmedia/src/pjmedia/conference.c
conference在Pjsip的media流中所处的位置(这里引用其他人的图):
1. 抽象Port
conference在抽象port时,把sound音频设备和stream都抽象成一个port,由conference管理port,和完成各个port的connect操作。
port的基本操作数据结构定义:
/**
* Port interface.
*/
typedef struct pjmedia_port
{
pjmedia_port_info info; /**< Port information. */
/** Port data can be used by the port creator to attach arbitrary
* value to be associated with the port.
*/
struct port_data {
void *pdata; /**< Pointer data. */
long ldata; /**< Long data. */
} port_data;
/**
* Get clock source.
* This should only be called by #pjmedia_port_get_clock_src().
*/
pjmedia_clock_src* (*get_clock_src)(struct pjmedia_port *this_port,
pjmedia_dir dir);
/**
* Sink interface.
* This should only be called by #pjmedia_port_put_frame().
*/
pj_status_t (*put_frame)(struct pjmedia_port *this_port,
pjmedia_frame *frame);
/**
* Source interface.
* This should only be called by #pjmedia_port_get_frame().
*/
pj_status_t (*get_frame)(struct pjmedia_port *this_port,
pjmedia_frame *frame);
/**
* Called to destroy this port.
*/
pj_status_t (*on_destroy)(struct pjmedia_port *this_port);
} pjmedia_port;
Port的主要操作接口有3个:put_frame,get_frame,on_destroy
其中,put_frame,是把sound port产生的数据(即mic的录音数据)一步步的传输到网络中。
get_frame,是把网络中接收到的数据,一步步的传输到sound设备中播放。
on_destroy是销毁port时使用。
这是所有port抽象的基础。
在看下,conference是怎么管理port,conference定义了自己的一个port数据结构,用于管理抽象的port。
conference定义的port数据结构如下:
/**
* This is a port connected to conference bridge.
*/
struct conf_port
{
pj_str_t name; /*
本文标签: PjsipConference
版权声明:本文标题:Pjsip conference分析 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/dongtai/1730019568a1219296.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论