jrtplib的sess.poll()出错

使用jrtplib的sess:poll()出现ERRO This function is not available when using the RTP poll thread feature,防火墙我已经关闭的了,在linux平台和windows平台有一样的错误。附上代码。

/*
   Here's a small IPv4 example: it asks for a portbase and a destination and 
   starts sending packets to that destination.
*/

#include "rtpsession.h"
#include "rtpudpv4transmitter.h"
#include "rtpipv4address.h"
#include "rtpsessionparams.h"
#include "rtperrors.h"
#include "rtplibraryversion.h"
#include "rtppacket.h"
#include <stdlib.h>
#include <stdio.h>
#include <iostream>
#include <string>

using namespace jrtplib;
#pragma comment(lib, "jrtplib.lib") 
#pragma comment(lib,"jthread.lib")
#pragma comment(lib,"WS2_32.lib")

//
// This function checks if there was a RTP error. If so, it displays an error
// message and exists.
//

//
// The main routine
void checkerror(int rtperr)
{
    if (rtperr < 0)
    {
        std::cout << "ERROR: " << RTPGetErrorString(rtperr) << std::endl;
        Sleep(10000);
        exit(-1);
    }
}

//
// The main routine
//
int main(void)
{
#ifdef RTP_SOCKETTYPE_WINSOCK
    WSADATA dat;
    WSAStartup(MAKEWORD(2, 2), &dat);
#endif // RTP_SOCKETTYPE_WINSOCK

    RTPSession session;

    RTPSessionParams sessionparams;
    sessionparams.SetOwnTimestampUnit(1.0 / 8000.0);
    sessionparams.SetAcceptOwnPackets(true);

    RTPUDPv4TransmissionParams transparams;
    transparams.SetPortbase(8000);

    int status = session.Create(sessionparams, &transparams);
    if (status < 0)
    {
        std::cerr << RTPGetErrorString(status) << std::endl;
        exit(-1);
    }

    uint8_t localip[] = { 127,0,0,1 };
    RTPIPv4Address addr(localip, 9000);

    status = session.AddDestination(addr);
    if (status < 0)
    {
        std::cerr << RTPGetErrorString(status) << std::endl;
        exit(-1);
    }

    session.SetDefaultPayloadType(96);
    session.SetDefaultMark(false);
    
    session.SetDefaultTimestampIncrement(160);

    uint8_t silencebuffer[160];
    for (int i = 0; i < 160; i++)
        silencebuffer[i] = 128;

    RTPTime delay(0.020);
    RTPTime starttime = RTPTime::CurrentTime();

    bool done = false;
    status = session.Poll();
    checkerror(status);
    while (!done)
    {
        status = session.SendPacket(silencebuffer, 160);
        if (status < 0)
        {
            std::cerr << RTPGetErrorString(status) << std::endl;
            exit(-1);
        }
    
        session.BeginDataAccess();
        if (session.GotoFirstSource())
        {
            do
            {
                RTPPacket *packet;

                while ((packet = session.GetNextPacket()) != 0)
                {
                    std::cout << "Got packet with "
                        << "extended sequence number "
                        << packet->GetExtendedSequenceNumber()
                        << " from SSRC " << packet->GetSSRC()
                        << std::endl;
                    session.DeletePacket(packet);
                }
            } while (session.GotoNextSource());
        }
        session.EndDataAccess();

        RTPTime::Wait(delay);

        RTPTime t = RTPTime::CurrentTime();
        t -= starttime;
        if (t > RTPTime(60.0))
            done = true;
    }

    delay = RTPTime(10.0);
    session.BYEDestroy(delay, "Time's up", 9);

#ifdef RTP_SOCKETTYPE_WINSOCK
    WSACleanup();
#endif // RTP_SOCKETTYPE_WINSOCK
    return 0;
}
阅读 2.5k
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题