RTP - LIB - Datenschreiben ?



  • Hallo,
    ich will die http://research.edm.uhasselt.be/~jori/page/index.php?n=CS.Jrtplib folgende lib benutzen um eine MJPEG zu streamen, das Beispiel habe ich soweit verstanden und nochmal etwas ausführlicher dokumentiert und erweitert. Jedenfalls die Methode SendPacket http://research.edm.uhasselt.be/jori/jrtplib/documentation/classjrtplib_1_1RTPSession.html erwartet neben den Einstellungen einen data Pointer. Hier beginnt meine Frage, wie genau soll ich jetzt ein MJPEG mit dieser Methode verschicken?

    Die Frage ist, was muss ich mit nem MJPEG machen damit ich es mit SendPacket() verschicken kann.

    Danke 🙂

    #include "rtpsession.h"
    #include "rtpudpv4transmitter.h"
    #include "rtpipv4address.h"
    #include "rtpsessionparams.h"
    #include "rtperrors.h"
    #include "rtprawpacket.h" //Abgeleitete Klasse RTPMJPEG
    #ifndef WIN32
    	#include <netinet/in.h>
    	#include <arpa/inet.h>
    #else
    	#include <winsock2.h>
    #endif // WIN32
    #include <stdlib.h>
    #include <stdio.h>
    #include <iostream>
    #include <string>
    
    //DEFINES//
    #define PAYLOADTYPE 26		//Payloadtype for MJPEG "26" found in RFC2435
    #define MARK false			//Marker ?
    #define TIMESTAMPINC 3000   //Increment of the timestamp 30fps = 3000; 25fps = 3600
    
    using namespace jrtplib;
    
    //
    // This function checks if there was a RTP error. If so, it displays an error
    // message and exists.
    //
    
    void checkerror(int rtperr)
    {
    	if (rtperr < 0)
    	{
    		std::cout << "ERROR: " << RTPGetErrorString(rtperr) << std::endl;
    		exit(-1);
    	}
    }
    
    //
    // The main routine
    //
    
    int main(void)
    {
    #ifdef WIN32
    	WSADATA dat;
    	WSAStartup(MAKEWORD(2,2),&dat);
    #endif // WIN32
    
    	RTPSession sess;													  // $$ Create a session object
    
    	uint16_t portbase,destport;
    	uint32_t destip;
    	std::string ipstr;
    	int status,i,num;
    
            // First, we'll ask for the necessary information
    
    	std::cout << "Enter local portbase:" << std::endl;
    	std::cin >> portbase;
    	std::cout << std::endl;
    
    	std::cout << "Enter the destination IP address" << std::endl;
    	std::cin >> ipstr;
    	destip = inet_addr(ipstr.c_str());
    	if (destip == INADDR_NONE)
    	{
    		std::cerr << "Bad IP address specified" << std::endl;
    		return -1;
    	}
    
    	// The inet_addr function returns a value in network byte order, but
    	// we need the IP address in host byte order, so we use a call to
    	// ntohl
    	destip = ntohl(destip);
    
    	std::cout << "Enter the destination port" << std::endl;
    	std::cin >> destport;
    
    	std::cout << std::endl;
    	std::cout << "Number of packets you wish to be sent:" << std::endl;
    	std::cin >> num;
    
    	// Now, we'll create a RTP session, set the destination, send some
    	// packets and poll for incoming data.
    
    	RTPUDPv4TransmissionParams transparams;								 // $$ Object for the transmition parameters 
    	RTPSessionParams sessparams;										 //	$$ Object for the sessionparameters
    
    	// IMPORTANT: The local timestamp unit MUST be set, otherwise
    	//            RTCP Sender Report info will be calculated wrong
    	// In this case, we'll be sending 10 samples each second, so we'll
    	// put the timestamp unit to (1.0/10.0)
    	sessparams.SetOwnTimestampUnit(1.0/90000.0);						// $$ Setting Timestamp - 90000Hz sample Rate for MJPEG
    	sessparams.SetAcceptOwnPackets(true);								// $$ ???
    	transparams.SetPortbase(portbase);									// $$ Setting local port 
    
    	sessparams.SetUsePollThread(false);									// $$ NOT using a background thread for polling the incoming data, no automatic response (RTCP packets) 
    	///////////////////////////////////////////
    
    	status = sess.Create(sessparams,&transparams);					   	// $$ Creating a session Create awaits (const RTPSessionParams &sessparams, RTPTransmitter *transmitter)
    	checkerror(status);
    
    	RTPIPv4Address addr(destip,destport);								// $$ Building the IP address/Port via constructur object: addr
    
    	status = sess.AddDestination(addr);									// $$ Set Destination, needs an object containing the IP address port (see above)
    	checkerror(status);
    
    	//DEFAULT RTP PACKAGE Parameters//
    	sess.SetDefaultMark(MARK);
    	sess.SetDefaultPayloadType(PAYLOADTYPE);							// §§ (M)JPEG = 26
    	sess.SetDefaultTimestampIncrement(TIMESTAMPINC);
    	//END - OF SETTING//
    
    	for (i = 1 ; i <= num ; i++)
    	{
    		printf("\nSending packet %d/%d\n",i,num);
    
    		// send the packet
    		status = sess.SendPacket((void *)"1234567890",10);              // $$ Sending package ||HERE DATA!!??||
    		checkerror(status);
    
    		// INCOMING DATA PROCESSING // 
    		sess.BeginDataAccess();											// $$ From BeginDataAccess to EndDataAccess: "The processing of incoming data"
    
    		// check incoming packets
    		if (sess.GotoFirstSourceWithData())								// $$ 
    		{
    			do
    			{
    				RTPPacket *pack;
    
    				while ((pack = sess.GetNextPacket()) != NULL)
    				{
    					// You can examine the data here
    					printf("Got packet !\n");
    																		// $$ Here we can do whatever we want with the received package
    					// we don't longer need the packet, so
    					// we'll delete it
    					sess.DeletePacket(pack);
    				}
    			} while (sess.GotoNextSourceWithData());
    		}
    
    		sess.EndDataAccess();
    		//END OF INCOMING DATA PROCESSING //
    
    #ifndef RTP_SUPPORT_THREAD
    		status = sess.Poll();
    		checkerror(status);
    #endif // RTP_SUPPORT_THREAD
    
    		RTPTime::Wait(RTPTime(1,0));
    	}
    
    	sess.BYEDestroy(RTPTime(10,0),0,0);									// $$ Informing other particapants of our depature and cleanup the RTPSession class
    
    #ifdef WIN32
    	WSACleanup();
    #endif // WIN32
    	return 0;
    }
    


  • Hi 🙂 niemand ein Tipp ?


Log in to reply