Pjsip conference分析

本文深入分析了Pjsip的Conference模块,探讨了如何抽象Port并实现混音功能。Port的核心操作包括put_frame、get_frame和on_destroy。conference通过管理port并利用delay_buf解决录音与播放同步问题。混音通过pjmedia_conf_connect_port接口实现,源Port的PCM数据在get_frame中与目标Port的mix_buf混合,完成多方通话的混音效果。
摘要由CSDN通过智能技术生成

    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;          /*
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值