媒体传输端口(pjmedia_transport)

来源:互联网 发布:淘宝网售后服务电话 编辑:程序博客网 时间:2024/05/28 15:05

媒体传输端口(pjmedia_transport)~~PJMEDIA的基础概念


媒体传输端口用于通过网络发送/接收媒体包。媒体传输端口接口可以通过扩展来支持发送/接收数据包的不同类型传输端口。

  媒体传输端口声明成pjmedia_transport“类”,类中接口部分功能在结构pjmedia_transport_op中定义。对于媒体传输端口的使用者(通常的使用者是媒体流),传输端口的“方法”被封装在pjmedia_transport_attach()函数,所以不需要直接调用在pjmedia_transport_op结构内的函数指针。

 

  媒体流和媒体传输端口的连接方式见下图:


基础的媒体传输端口用法

        通常媒体传输端口的生命周期包括以下步骤。

创建媒体传输端口

  应用程序在需要建立媒体会话时创建到远端的媒体传输端口。使用特定函数创建特殊作用的媒体传输端口;例如:对于UDP媒体传输端口,它使用pjmedia_transport_udp_create()或pjmedia_transport_udp_create2()函数。不同的媒体传输端口的创建使用各自的API。

  另外,应用程序首次启动后要创建多个媒体传输端口池,这样做应该比较好,因为应用程序在发送初始会话建立请求(例如SIP的INVITE请求)中已经指定了RTP端口,但如果应用程序创建媒体传输端口的时间晚于建立媒体连接时(通常当发到200/OK或发到18x早期媒体),可能发生设定的RTP端口被其它程序占用的麻烦。

附加和使用媒体传输端口

       应用程序在创建媒体会话(pjmedia_session_create())时指定媒体传输端口,它将传输端口实例做为参数传输给pjmedia_stream_create()函数,直接使用创建媒体流。(注:媒体会话是应用于两个终端之间通信的高级别抽象,它将包含一个以上的媒体流,如音频流和视频流)。

  当流创建后,它将使用pjmedia_transport_attch()函数,附加自己到媒体传输端口。那个在媒体传输端口的“虚函数指针”(pjmedia_transport_op)中称作“attach()”方法的封装。除此以外,流将给传输端口指定两个回调函数:一个函数用于收到RTP包后的回调,另一个用于收到RTCP包后的回调。pjmedia_transport_attch()函数也会建立外送RTP和RTCP包的目标端口。

  当流需要发送外送RTP/RTCP包中,它将调用媒体传输端口API中的pjmedia_transport_send_rtp()和pjmedia_transport_send_rtcp()函数,那个在媒体传输端口的“虚函数指针”(pjmedia_transport_op)中称作“send_rtp()”和“send_rtcp()”方法的简单封装。

  当流被销毁后,它将调用pjmedia_transport_detach()函数从媒体传输端口脱离。那个在媒体传输端口的“虚函数指针”(pjmedia_transport_op)中称作“detach()”方法的简单封装。当传输端口从它的使用者(流)脱离后,将不再将到达的RTP/RTCP包通告给流。同时也因目标端口被清理而拒绝发送外送的包。

重新使用媒体传输端口

  当传输端口被脱离后,应用程序可以重新附加传输端口给其它想使用它的流。脱离流和重新附加流,好过关闭和重新打开传输端口,这样更有效率(套接字不需要关闭和重新打开)。当然,应用程序可以选择使用它的恰当方式。

销毁媒体传输端口

  最后,如果应用程序不需要媒体传输端口时,可以调用pjmedia_transport_close()函数,那个在媒体传输端口的“虚函数指针”(pjmedia_transport_op)中称作“destroy ()”方法的封装。此函数释放所有传输端口使用的资源,如套接字和内存。

与SDP通告/应答的交互

  对于基础UDP传输端口,媒体传输端口使用上述“基础媒体传输端口用法”大概足够用了。然而,更复杂的媒体传输端口,如安全RTP(SRTP)媒体传输端口和ICE媒体传输端口需要更方便地与SDP通告和应答协商互通。

  媒体传输端口将通过下列函数与SDP通告和应答协商互通:

-   pjmedia_transport_media_create(),用于为新媒体会话初始化媒体传输端口

-   pjmedia_transport_encode_sdp(),用于编码SDP通告和应答

-   pjmedia_transport_media_start(),用于激活SDP通告和应答已经协商后的设备

-   pjmedia_transport_media_stop(),用于终结媒体传输端口和复位传输端口到空闲状态。

这些API的用法在SDP通告应答的上下文描述。

为新会话初始化传输端口

  应用程序必须在一个新会话之前调用pjmedia_transport_media_create()函数。

创建SDP通告/应答

  函数pjmedia_transport_encode_sdp()用于在SDP发送和与远程SDP协商之前,将传输端口的附加信息给本地SDP。当创建通告时,使用本地SDP(同时rem_sdp为NULL)调用pjmedia_transport_encode_sdp()。媒体传输端口将在本地SDP中添加相关属性,应用程序用将给定的本地SDP给INVATE会话,发送到无端代理。

  在创建新应答时,也要调用pjmedia_transport_encode_sdp(),但此时需要将本地和远端SDP传递给函数。如果当前的远端通告中与传输端口功能相关属性变化,媒体传输端口将再一次修改本地SDP并添加相关属性给本地SDP。如果远端SDP不包含相关属性,则该会话的传输端口功能不会激活。

  当应用程序发送随后的SDP通告或应用时,函数pjmedia_transport_encode_sdp()也将被调用。媒体传输端口将依据会话状态编码相关属性。

通告/应答完成

  使用SDP协商状态机(通告/应答模型,RFC3264)(正常情况下是PJSIP INVATE会话部分),一旦本地和远端SDP协商完成,应用程序将传递本地和远端SDP给pjmedia_transport_media_start(),在会话中激活设置。此函数被最初和后面的SDP协商所调用。

停止传输端口

  一旦会话停止,应用程序必须调用pjmedia_transport_media_stop()函数,停止传输端口功能。应用程序可以使用以下函数为后续的媒体会话重新使用传输端口:pjmedia_transport_media_create()、pjmedia_transport_encode_sdp()、pjmedia_transport_media_start()、pjmedia_transport_media_stop()。

实现传输端口

  To implement a new type of mediatransport, one needs to "subclass" the media transport"class" (pjmedia_transport) by providing the"methods" in the media transport "interface" (pjmedia_transport_op), and provides afunction to create this new type of transport (similar to pjmedia_transport_udp_create() function).

  The media transport is expected to runindepently, that is there should be no polling like function to poll thetransport for incoming RTP/RTCP packets. This normally can be done byregistering the media sockets to the media endpoint's IOQueue, which allows thetransport to be notified when incoming packet has arrived.

  Alternatively, media transport may utilizethread(s) internally to wait for incoming packets. The thread then will callthe appropriate RTP or RTCP callback provided by its user (stream) wheneverpacket is received. If the transport's user is a stream, then the callbacksprovided by the stream will be thread-safe, so the transport may call thesecallbacks without having to serialize the access with some mutex protection.But the media transport may still have to protect its internal data with mutexprotection, since it may be called by application's thread (for example, tosend RTP/RTCP packets).



0 0
原创粉丝点击