分类: LINUX
2009-05-11 19:28:34
最近做的东西,需要使用RTP,但是下载了 JRTPLIB,按照example用了用上了,
可是,结果确是很差,还不如直接使用TCP来做。
但是,我确信,RTP可以做得更好,于是,仔细研究,并做笔记,记录之。
相关介绍太少了,所以,我决定从代码入手,虽然这是比较不好的一个方法,
但是,至少是一种方法。
那就一个一个类的来看吧,怎么看呢?
我是从例子了入手,example1中,首先定义了RTPUDPv4TransmissionParams,RTPSessionParams和RTPSession,因为RTPSession是一个高级类,综合了大部的功能,比较复杂,而且RTPSessionParams和RTPUDPv4TransmissionParams也是RTPSession::Create时需要的两个变量,所以,我觉得先看RTPSessionParams。
/** Describes the parameters for to be used by an RTPSession instance.
* Describes the parameters for to be used by an RTPSession instance. Note that the own timestamp
* unit must be set to a valid number, otherwise the session can't be created.
*/
/************************************************************************/
/* 描述了RTPSession实例中使用的参数 */
/* 注意timestamp 单位必须设为有效数据,否则将不能创建成功 */
/************************************************************************/
class RTPSessionParams
{
public:
RTPSessionParams();
/** If \c usethread is \c true, the session will use a poll thread to automatically process incoming
* data and to send RTCP packets when necessary.
*/
/************************************************************************/
/* 如果 \c usethread为 \c true,这个会话将使用poll线程,poll线程会自动 */
/* 处理接收到的数据,并且在必要的时候发送RTCP packets */
/************************************************************************/
int SetUsePollThread(bool usethread);
/** Returns whether the session should use a poll thread or not (default is \c true). */
/************************************************************************/
/* 返回session是否利用poll线程,默认为 \c true */
/************************************************************************/
bool IsUsingPollThread() const { return usepollthread; }
/** Sets the maximum allowed packet size for the session. */
/************************************************************************/
/* 设置允许的最大的packet size */
/************************************************************************/
void SetMaximumPacketSize(size_t max) { maxpacksize = max; }
/** Returns the maximum allowed packet size (default is 1400 bytes). */
/************************************************************************/
/* 返回允许的最大的packet size, 默认为1400字节 */
/************************************************************************/
size_t GetMaximumPacketSize() const { return maxpacksize; }
/** If the argument is \c true, the session should accept its own packets and store
* them accordingly in the source table.
*/
/************************************************************************/
/* 如果变量值为 \c true,session将接受自己的packets并相应地将它们存储在 */
/* 源表中 */
/************************************************************************/
void SetAcceptOwnPackets(bool accept) { acceptown = accept; }
/** Returns \c true if the session should accept its own packets (default is \c false). */
/************************************************************************/
/* 如果session要接受自己的packets,则返回 \c true(缺省为 \c false) */
/************************************************************************/
bool AcceptOwnPackets() const { return acceptown; }
/** Sets the receive mode to be used by the session. */
/************************************************************************/
/* 设置session将使用的接收模式 */
/************************************************************************/
void SetReceiveMode(RTPTransmitter::ReceiveMode recvmode) { receivemode = recvmode; }
/** Gets the receive mode to be used by the session (default is: accept all packets). */
/************************************************************************/
/* 获取session将使用的接收模式(缺省为: accept all packets). */
/************************************************************************/
RTPTransmitter::ReceiveMode GetReceiveMode() const { return receivemode; }
/** Sets the timestamp unit for our own data.
* Sets the timestamp unit for our own data. The timestamp unit is defined as a time interval in
* seconds divided by the corresponding timestamp interval. For example, for 8000 Hz audio, the
* timestamp unit would typically be 1/8000. Since this value is initially set to an illegal value,
* the user must set this to an allowed value to be able to create a session.
*/
/************************************************************************/
/* 设置我们数据的时间戳单位。时间戳单位被定义为以秒为单位的时间间隔。例 */
/* 如,8000Hz的音频,时间戳单位为1/8000。由于该值初始为无效值,用户必须 */
/* 将其设置为有效值,以便能够创建一个session */
/************************************************************************/
void SetOwnTimestampUnit(double tsunit) { owntsunit = tsunit; }
/** Returns the currently set timestamp unit. */
/************************************************************************/
/* 返回时间戳单位 */
/************************************************************************/
double GetOwnTimestampUnit() const { return owntsunit; }
/** Sets a flag indicating if a DNS lookup should be done to determine our hostname (to construct a CNAME item).
* If \c v is set to \c true, the session will ask the transmitter to find a host name based upon the IP
* addresses in its list of local IP addresses. If set to \c false, a call to \c gethostname or something
* similar will be used to find the local hostname. Note that the first method might take some time.
*/
/************************************************************************/
/* 指明是否需要DNS lookup来确定主机名(构造一个CNAME) */
/* 如果 \c v设为 \c true,session会要求transmitter查找本地IP地址列表中IP*/
/* 相应的主机名 */
/************************************************************************/
void SetResolveLocalHostname(bool v) { resolvehostname = v; }
/** Returns whether the local hostname should be determined from the transmitter's list of local IP addresses
* or not (default is \c false).
*/
/************************************************************************/
/* 返回本地主机名是否需要由transmitter的IP地址列表中来确定,(缺省为 \c false */
/************************************************************************/
bool GetResolveLocalHostname() const { return resolvehostname; }
#ifdef RTP_SUPPORT_PROBATION
/** If probation support is enabled, this function sets the probation type to be used. */
/************************************************************************/
/* 如果probation suport是激活的,这个函数将设置使用的probation type */
/************************************************************************/
void SetProbationType(RTPSources::ProbationType probtype) { probationtype = probtype; }
/** Returns the probation type which will be used (default is RTPSources::ProbationStore). */
/************************************************************************/
/* 返回使用的probatin类型,(缺省为RTPSource::ProbationStore) */
/************************************************************************/
RTPSources::ProbationType GetProbationType() const { return probationtype; }
#endif // RTP_SUPPORT_PROBATION
/** Sets the session bandwidth in bytes per second. */
/************************************************************************/
/* 设置session的带宽,单位是字节每秒 */
/************************************************************************/
void SetSessionBandwidth(double sessbw) { sessionbandwidth = sessbw; }
/** Returns the session bandwidth in bytes per second (default is 10000 bytes per second). */
/************************************************************************/
/* 返回session的带宽,单位是字节每秒(缺省为10000字节每秒) */
/************************************************************************/
double GetSessionBandwidth() const { return sessionbandwidth; }
/** Sets the fraction of the session bandwidth to be used for control traffic. */
/************************************************************************/
/* 设置用来控制通信的fraction的session的带宽 */
/************************************************************************/
void SetControlTrafficFraction(double frac) { controlfrac = frac; }
/** Returns the fraction of the session bandwidth that will be used for control traffic (default is 5%). */
/************************************************************************/
/* 返回用来控制通信的fraction的session的带宽(缺省为5%) */
/************************************************************************/
double GetControlTrafficFraction() const { return controlfrac; }
/** Sets the minimum fraction of the control traffic that will be used by senders. */
/************************************************************************/
/* 设置最小用于通信的fraction,这将用于发送者 */
/************************************************************************/
void SetSenderControlBandwidthFraction(double frac) { senderfrac = frac; }
/** Returns the minimum fraction of the control traffic that will be used by senders (default is 25%). */
/************************************************************************/
/* 返回用于发送的最小的控制通信的fraction,(缺省为25%) */
/************************************************************************/
double GetSenderControlBandwidthFraction() const { return senderfrac; }
/** Set the minimal time interval between sending RTCP packets. */
/************************************************************************/
/* 设置发送rtcp packets的最小时间间隔 */
/************************************************************************/
void SetMinimumRTCPTransmissionInterval(const RTPTime &t) { mininterval = t; }
/** Returns the minimal time interval between sending RTCP packets (default is 5 seconds). */
/************************************************************************/
/* 返回发送rtcp packets的最小时间间隔,(缺省为5秒) */
/************************************************************************/
RTPTime GetMinimumRTCPTransmissionInterval() const { return mininterval; }
/** If \c usehalf is set to \c true, the session will only wait half of the calculated RTCP
* interval before sending its first RTCP packet.
*/
/************************************************************************/
/* 如果 \c usehalf设为 \c true,session将在发送第一个RTCP packet之前,只*/
/* 等待一半计算出的RTCP时间间隔 */
/************************************************************************/
void SetUseHalfRTCPIntervalAtStartup(bool usehalf) { usehalfatstartup = usehalf; }
/** Returns whether the session will only wait half of the calculated RTCP interval before sending its
* first RTCP packet or not (default is \c true).
*/
/************************************************************************/
/* 返回session在发送第一个RTCP packet之前,是否只等待一半计算出的RTCP时间间隔*/
/************************************************************************/
bool GetUseHalfRTCPIntervalAtStartup() const { return usehalfatstartup; }
/** If \c v is \c true, the session will send a BYE packet immediately if this is allowed. */
/************************************************************************/
/* 如果 \c v为 \c trur,session会立即发送一个BYE packet(如果允许) */
/************************************************************************/
void SetRequestImmediateBYE(bool v) { immediatebye = v; }
/** Returns whether the session should send a BYE packet immediately (if allowed) or not (default is \c true). */
/************************************************************************/
/* 返回session是否需要立即发送一个BYE packet(如果允许)(缺省为 \c true)*/
/************************************************************************/
bool GetRequestImmediateBYE() const { return immediatebye; }
/** When sending a BYE packet, this indicates whether it will be part of an RTCP compound packet
* that begins with a sender report (if allowed) or a receiver report.
*/
/************************************************************************/
/* 当发送BYE packet的时候,此处表明这将成为RTCP compound packet的一部分 */
/* 这里提到的RTCP compound packet以一个发送报告(如果允许)或接收报告开始*/
/************************************************************************/
void SetSenderReportForBYE(bool v) { SR_BYE = v; }
/** Returns \c true if a BYE packet will be sent in an RTCP compound packet which starts with a
* sender report; if a receiver report will be used, the function returns \c false (default is \c true).
*/
/************************************************************************/
/* 返回 \c true,如果一个BYE packet在一个RTCP compound packet中发送,此 */
/* RTCP compound packet以一个发送报告开始。如果用接收报告,此函数返回 \c false */
/* (缺省)为 \c true */
/************************************************************************/
bool GetSenderReportForBYE() const { return SR_BYE; }
/** Sets the multiplier to be used when timing out senders. */
/************************************************************************/
/* 设置中止发送者时使用的multiplier */
/************************************************************************/
void SetSenderTimeoutMultiplier(double m) { sendermultiplier = m; }
/** Returns the multiplier to be used when timing out senders (default is 2). */
/************************************************************************/
/* 返回中止发送者时使用的multiplier(缺省为2) */
/************************************************************************/
double GetSenderTimeoutMultiplier() const { return sendermultiplier; }
/** Sets the multiplier to be used when timing out members. */
/************************************************************************/
/* 设置中止成员时使用的multiplier */
/************************************************************************/
void SetSourceTimeoutMultiplier(double m) { generaltimeoutmultiplier = m; }
/** Returns the multiplier to be used when timing out members (default is 5). */
/************************************************************************/
/* 返回中止成员时使用的multiplier(缺省为5) */
/************************************************************************/
double GetSourceTimeoutMultiplier() const { return generaltimeoutmultiplier; }
/** Sets the multiplier to be used when timing out a member after it has sent a BYE packet. */
/************************************************************************/
/* 设置在发送BYE packet后,中止成员时使用的multiplier */
/************************************************************************/
void SetBYETimeoutMultiplier(double m) { byetimeoutmultiplier = m; }
/** Returns the multiplier to be used when timing out a member after it has sent a BYE packet (default is 1). */
/************************************************************************/
/* 返回在发送BYE packet后,中止成员时使用的multiplier(缺省为1) */
/************************************************************************/
double GetBYETimeoutMultiplier() const { return byetimeoutmultiplier; }
/** Sets the multiplier to be used when timing out entries in the collision table. */
/************************************************************************/
/* 设置中止collision表中入口时使用的multiplier */
/************************************************************************/
void SetCollisionTimeoutMultiplier(double m) { collisionmultiplier = m; }
/** Returns the multiplier to be used when timing out entries in the collision table (default is 10). */
/************************************************************************/
/* 返回中止collision表中入口时使用的multiplier,(缺省为10) */
/************************************************************************/
double GetCollisionTimeoutMultiplier() const { return collisionmultiplier; }
/** Sets the multiplier to be used when timing out SDES NOTE information. */
/************************************************************************/
/* 设置中止SDES NOTE信息时使用的multiplier */
/************************************************************************/
void SetNoteTimeoutMultiplier(double m) { notemultiplier = m; }
/** Returns the multiplier to be used when timing out SDES NOTE information (default is 25). */
/************************************************************************/
/* 返回中止SDES NOTE信息时使用的multiplier,(缺省为25) */
/************************************************************************/
double GetNoteTimeoutMultiplier() const { return notemultiplier; }
to be continued...