Hi I am trying to setup live555 to stream rtsp with an ondemandserver from a 
microphone, but I am not sure how to do so. I have attempted to do this by 
overriding OnDemandServerMediaSubsession and FramedSource, but I am running 
into issues where I hear a bit of sound for half a second and then quiet, in 
VLC the Messages say "buffer arrived way too early"... I am encoding using 
ffmpeg to encode the audio as mp2. I have attached what I am doing here:
#ifndef _FRAMED_SOURCE_HH
#include "FramedSource.hh"
#include "ImageTransfer.h"
#endif
 
class MP2DeviceSource : public FramedSource {
public:
        static MP2DeviceSource* createNew(UsageEnvironment& env, unsigned int 
stream_id,
                                                AudioTransfer * audioTransfer);
 
public:
        EventTriggerId eventTriggerId;
 
protected:
        MP2DeviceSource(UsageEnvironment& env,
                                ImageTransfer * imageTransfer );
        virtual ~MP2DeviceSource();
private:
        virtual void doGetNextFrame();
 
private:
        static void deliverFrame0(void* clientData);
        void deliverFrame();
 
private:
        
        AudioTransfer * audioTx;
 
};
  Collapse | Copy Code#include "MP2DeviceSource.h"

MP2DeviceSource* 
MP2DeviceSource::createNew(UsageEnvironment& env, unsigned int stream_id,
                                AudioTransfer * audioTransfer)
{
        return new MaxMP2DeviceSource(env, audioTransfer);
}
 
MP2DeviceSource::MP2DeviceSource(UsageEnvironment& env, AudioTransfer * 
audioTransfer) 
        : FramedSource(env), audioTx(audioTransfer)
{
        if (eventTriggerId == 0)
                eventTriggerId = 
envir().taskScheduler().createEventTrigger(deliverFrame0);
}
 
MP2DeviceSource::~MP2DeviceSource()
{
        envir().taskScheduler().deleteEventTrigger(eventTriggerId);
        eventTriggerId = 0;
}
 
void MP2DeviceSource::doGetNextFrame()
{
        deliverFrame();
}
 
void MP2DeviceSource::deliverFrame0(void *clientData)
{
        ((MP2DeviceSource*)clientData)->deliverFrame();
}
 
   static const unsigned __int64 epoch = 116444736000000000;
   int
   gettimeofday(struct timeval * tp, struct timezone * tzp)
   {
       FILETIME    file_time;
       SYSTEMTIME  system_time;
       ULARGE_INTEGER ularge;
   
       GetSystemTime(&system_time);
       SystemTimeToFileTime(&system_time, &file_time);
       ularge.LowPart = file_time.dwLowDateTime;
       ularge.HighPart = file_time.dwHighDateTime;
   
       tp->tv_sec = (long) ((ularge.QuadPart - epoch) / 10000000L);
       tp->tv_usec = (long) (system_time.wMilliseconds * 1000);
   
       return 0;
  }
 

void MP2DeviceSource::deliverFrame()
{
 
gettimeofday(&fPresentationTime, NULL);
 
    audioTx->GetMP2Image( &fTo, &fFrameSize );
    fDurationInMicroseconds = 26000;
        
        FramedSource::afterGetting(this);
}
  Collapse | Copy Code#ifndef _ON_DEMAND_SERVER_MEDIA_SUBSESSION_HH
#include "OnDemandServerMediaSubsession.hh"
#endif
 
class MP2AudioMediaSubsession: public OnDemandServerMediaSubsession {
public:
   static MP2AudioMediaSubsession* createNew(UsageEnvironment& evn, 
                                                unsigned int sid, 
                                                Boolean requestFirstSource,
                                                AudioTransfer * audioTransfer);
protected:
   MP2AudioMediaSubsession(UsageEnvironment& env, 
                           Boolean reuseFirstSource, 
                           AudioTransfer * audioTransfer);
 
   virtual ~MP2AudioMediaSubsession();
 
protected:
   virtual FramedSource* createNewStreamSource(unsigned clientSessionId,        
    
                                                unsigned& estBitrate);
 
   virtual RTPSink* createNewRTPSink(Groupsock* rtpGroupSock, 
                                     unsigned char rtpPayloadTypeIfDynamic, 
                                     FramedSource* inputSource);
 
protected:
  unsigned int id;
  AudioTransfer * audioTx;
};
  Collapse | Copy Code#include "MP2MediaSubsession.h"
#include "MP2DeviceSource.h"
#include "MPEG1or2AudioRTPSink.hh"
#include "MPEG1or2AudioStreamFramer.hh"

 
MP2AudioMediaSubsession* 
MP2AudioMediaSubsession::createNew(UsageEnvironment& env,
                                        Boolean reuseFirstSource, 
                                        AudioTransfer * audioTransfer)
{
        return new MP2AudioMediaSubsession(env, reuseFirstSource, imageTransfer 
);
}
 
MP2AudioMediaSubsession::MP2AudioMediaSubsession(UsageEnvironment& env, 
                                                        Boolean 
reuseFirstSource,
                                                        AudioTransfer * 
audioTransfer)
        : OnDemandServerMediaSubsession(env, reuseFirstSource), 
audioTx(audioTransfer) 
{
}
FramedSource* MP2AudioMediaSubsession::createNewStreamSource(unsigned 
clientSessionId,
                                                                unsigned 
&estBitrate)
{
   estBitrate = 44100;
   MP2DeviceSource *source =  MP2DeviceSource::createNew(envir(), id, audioTx);
   return MPEG1or2AudioStreamFramer::createNew(envir(), source );
}
 
RTPSink* MP2AudioMediaSubsession::createNewRTPSink(Groupsock* rtpGroupSock,
                                                unsigned char 
rtpPayloadTypeIfDynamic,
                                                FramedSource* inputSource)
{
        return MPEG1or2AudioRTPSink::createNew( envir(), rtpGroupSock );
}
 
MP2AudioMediaSubsession::~MP2AudioMediaSubsession()
{
}                                         
_______________________________________________
live-devel mailing list
live-devel@lists.live555.com
http://lists.live555.com/mailman/listinfo/live-devel

Reply via email to