视频会议订阅模式设计

之前讨论的思路:
  • 让每一个会议成员的结构体conference_member_t对象中增加一个链表,保存多个要订阅这个成员视频数据的其他成员对象的指针。
  • 但是这样做有一个问题,显然某成员只能订阅另外一个成员的视频而不能同时订阅多个,因此上面这种订阅记录方式有可能导致订阅多个,额外增加判断方式也麻烦。
  • 另一个麻烦在于使用键控时是操作的当前这个用户线程,而若是要成功实现订阅却要在当前用户线程修改其他用户的数据,会增加锁的使用和复杂度。
  • 方便之处在于遍历读取视频数据到该成员时,能够很方便的将该视频数据转发给订阅了的其他成员。
换一种思路:
  • 在每一个会议member的结构体中增加一个conference_member_t *target_video_member;变量,代表该成员想订阅的目标成员。
  • 如果该目标成员指针为NULL,说明没有想要特殊订阅的,那就按照正常逻辑去获取video_floor_holder成员的视频数据。
  • 如果有想订阅的目标成员,那就去获取这个目标成员的当前一帧视频数据。
  • 首先用一个for循环遍历读取每个会议成员的一帧视频数据,然后保存到该member的结构体对象中。
  • 再用一个for循环遍历各个成员,根据订阅的目标成员去读取对应的视频数据。
  • 以上代码修改主要在conference_video_thread_run函数中。
如何绑定按键订阅指定用户的问题?
  • conference_loop_input函数中,会对应每个member开启的一个线程,去循环接收按键控制信息。比如在客户端按键'0',则在该函数中会接收到dtmf字符'0',然后转到调用switch_ivr_dmachine_feed函数将字符传到switch_ivr_dmachine_ping函数去检查该字符是否有匹配的执行动作函数调用,若是找到了那就执行该动作函数。
  • 键控字符和执行动作有一个对应的结构体映射表:
static struct _mapping control_mappings[] = {
    {"mute", conference_loop_fn_mute_toggle},
     ...
    {"vid-floor-force", conference_loop_fn_vid_floor_force}
};
  • 然后在member_bind_controls函数中,会读取conference.conf.xml配置文件中指定的按键字符和对应的动作配置,然后绑定上面的回调函数。
<caller-controls>
    <group name="default">
      <control action="mute" digits="0"/>
       ...
      <control action="vid-floor-force" digits="#"/>
    </group>
  </caller-controls>
  • 因此,若要新增订阅指定会议成员的视频键控功能,需要在以上几个地方进行修改,新增一个执行键控动作的回调函数。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 教程一:视频截图(Tutorial 01: Making Screencaps) 首先我们需要了解视频文件的一些基...
    90后的思维阅读 4,795评论 0 3
  • 课程第一天,全身心投入现场,60个同学,不同镜子照射。更多的是觉察,时不时心脑对话,丰富的一天!
    少鹰阅读 124评论 0 0
  • 南康啊,今年36岁了吧。还在等张先生吗?张先生,大概,嗯……岁月静好,现世安稳吗?应该是这样的吧。安如你愿……那么...
    柒篱阅读 1,133评论 1 2
  • 在天亮时祈求长久,在天黑时等待天亮
    Ragnarok_阅读 125评论 0 0
  • 红叶醉语,我在想你 细雨敲窗红叶醉语梧桐树下画有你的样子抚一曲高山流水演绎千古传奇 你我相识在落叶纷飞的秋季犹如一...
    叶冷随记阅读 422评论 0 1