[Live-devel] Can't stream Mpeg4
    Georgy Steshin 
    gosha212 at gmail.com
       
    Mon Sep 14 14:16:32 PDT 2009
    
    
  
Hi everybody,
I have a problem with streaming mpeg4. My program capture the frames from
the camera encodes it to xvid and streams it. For some reason I don't see
outgoing packet in wireshark and if I put a breakpoint in
OutputSocket::write it never reaches it. Hope for your help. Sorry for the
poor english.
 
Here is the source code:
 
========Start  DeviceSourceCamera.h =======
#pragma once
 
#include <DeviceSource.hh>
#include "liveMedia.hh"
#include "BasicUsageEnvironment.hh"
 
#include "cv.h"
#include "highgui.h"
 
#include <revel.h>
 
class DeviceSourceCammera: public DeviceSource {
public:
      static DeviceSourceCammera* createNew(UsageEnvironment& env,
DeviceParameters params);
 
      CvCapture* capture;
 
protected:
      DeviceSourceCammera(UsageEnvironment& env, DeviceParameters params);
 
      virtual ~DeviceSourceCammera();
 
private:
      virtual void doGetNextFrame();
 
private:
      void deliverFrame();
 
private:
      DeviceParameters fParams;
};
 
========End  DeviceSourceCamera.h =======
 
========Start  DeviceSourceCamera.cpp =======
#include "DeviceSourceCamera.h"
 
 
 
DeviceSourceCammera::DeviceSourceCammera(UsageEnvironment& env,
DeviceParameters params) : DeviceSource(env, params)
{
      //initiate the device
      
      //Create a window to display
      capture = cvCreateCameraCapture(0);
      cvNamedWindow("playBack", 1); 
}
 
DeviceSourceCammera* DeviceSourceCammera::createNew(UsageEnvironment& env,
DeviceParameters params) 
{
      return new DeviceSourceCammera(env, params);
}
 
void DeviceSourceCammera::doGetNextFrame() 
{
      //Grab the image from the camera
 
      if (0 /* the source stops being readable */) 
      {
            handleClosure(this);
            fprintf(stderr,"In Grab Image V4l, the source stops being
readable!!!\n");
            return;
      }
 
      deliverFrame();
}
 
void DeviceSourceCammera::deliverFrame() 
{
      //Encode here the frame
 
 
      IplImage *img = 0;
 
      if (!isCurrentlyAwaitingData()) 
            return;
 
      int width = 640;
      int height = 480; 
      int frameSize;
 
      const char *filename = "test.m4v";
      Revel_Error revError;
 
      if (REVEL_API_VERSION != Revel_GetApiVersion())
      {
            printf("ERROR: Revel version mismatch!\n");
            printf("Headers: version %06x, API version %d\n", REVEL_VERSION,
REVEL_API_VERSION);
            printf("Library: version %06x, API version %d\n",
Revel_GetVersion(), Revel_GetApiVersion());
            exit(1);
      }
 
 
      int encoderHandle;
      revError = Revel_CreateEncoder(&encoderHandle);
      if (revError != REVEL_ERR_NONE)
      {
            printf("Revel Error while creating encoder: %d\n", revError);
            exit(1);
      }
 
      Revel_Params revParams;
    Revel_InitializeParams(&revParams);
    revParams.width = width;
    revParams.height = height;
    revParams.frameRate = 25.0f;
    revParams.quality = 1.0f;
    revParams.codec = REVEL_CD_XVID;
 
 
      revError = Revel_EncodeStart(encoderHandle, filename, &revParams);
      if (revError != REVEL_ERR_NONE)
      {
            printf("Revel Error while starting encoding: %d\n", revError);
            exit(1);
      }
 
 
      //Grab image
      do
      {
            cvGrabFrame(capture);  
            img=cvRetrieveFrame(capture);
 
            cvShowImage("playBack", img);
            cvWaitKey(20);
      }while(img->imageData == 0);
 
      Revel_VideoFrame frame;
      frame.width = width;
      frame.height = height;
      frame.bytesPerPixel = 3;
      frame.pixelFormat =  REVEL_PF_BGR;
      frame.pixels = new int[img->imageSize];
      memset(frame.pixels, 0, img->imageSize);
 
      memcpy(frame.pixels, img->imageData, img->imageSize);
 
      revError = Revel_EncodeFrame(encoderHandle, &frame, &frameSize);
      if (revError != REVEL_ERR_NONE)
      {
            printf("Revel Error while writing frame: %d\n", revError);
            exit(1);
      }
 
      if (img->imageSize > fMaxSize)
      {
            frameSize = fMaxSize;
      }
      else 
            frameSize = img->imageSize;
      fFrameSize = frameSize;
 
//    delete fTo;
      fTo = new unsigned char[img->imageSize];
      memcpy(fTo, frame.pixels, frameSize);
 
      Revel_DestroyEncoder(encoderHandle);
  
      nextTask() = envir().taskScheduler().scheduleDelayedTask(0,
(TaskFunc*) afterGetting,this);
}
 
DeviceSourceCammera::~DeviceSourceCammera() {
 //printf("DeviceSourceCammera Deconstructor...");
      //cvReleaseCapture(&capture);
      //cvDestroyWindow("playBack");
}
========End  DeviceSourceCamera.cpp =======
 
======== (Main) Start WebCam.cpp ============
 
#include "liveMedia.hh"
#include "BasicUsageEnvironment.hh"
#include "GroupsockHelper.hh"
#include "DeviceSourceCamera.h"
 
UsageEnvironment* env;
MPEG4VideoStreamFramer* videoSource;
RTPSink* videoSink;
DeviceSourceCammera* fileSource;
 
void afterPlaying(void* /*clientData*/);
void play();
 
int main()
{
      TaskScheduler* scheduler = BasicTaskScheduler::createNew();
      env = BasicUsageEnvironment::createNew(*scheduler);
 
      char const* destinationAddressStr = "192.168.0.7";
      struct in_addr destinationAddress;
      destinationAddress.s_addr = our_inet_addr(destinationAddressStr);
 
      const unsigned short rtpPortNum = 8888;
      const unsigned short rtcpPortNum = rtpPortNum+1;
      const unsigned char ttl = 7;
 
      const Port rtpPort(rtpPortNum);
      const Port rtcpPort(rtcpPortNum);
 
      Groupsock rtpGroupsock(*env, destinationAddress, rtpPort, ttl);
      Groupsock rtcpGroupsock(*env, destinationAddress, rtcpPort, ttl);
 
      
 
      videoSink = MPEG4ESVideoRTPSink::createNew(*env, &rtpGroupsock, 96);
      const unsigned estimatedSessionBandwidth = 4500; 
      const unsigned maxCNAMElen = 100;
      unsigned char CNAME[maxCNAMElen+1];
      gethostname((char*)CNAME, maxCNAMElen);
      CNAME[maxCNAMElen] = '\0';
 
      RTCPInstance* rtcp = RTCPInstance::createNew(*env, &rtcpGroupsock,
estimatedSessionBandwidth, CNAME, videoSink, NULL, False);
      DeviceParameters params;
 
      fileSource = DeviceSourceCammera::createNew(*env, params);
      if (fileSource == NULL) {
            *env << "Unable to open source\n";
            exit(1);
      }
 
 
 
      play();
      env->taskScheduler().doEventLoop();
 
      return 0;
}
 
void play() 
{
 
      FramedSource* videoES = fileSource;
 
      // Create a framer for the Video Elementary Stream:
      videoSource = MPEG4VideoStreamFramer::createNew(*env, videoES);
 
      // Finally, start playing:
      *env << "Beginning to read from file...\n";
      videoSink->startPlaying(*videoSource, afterPlaying, videoSink);
}
 
void afterPlaying(void* /*clientData*/) 
{
      *env << "...done reading from file\n";
 
      Medium::close(videoSource);
 
      // Start playing once again:
      play();
}
 
 
 
 
Georgy Steshin,
 
image001
 
      Hutsot Shefayim P.O.B 348 
      Shefayim        Israel  60990
      Mobile:    +972-52-6222528
      Office:      +972-9-788 7342
      Fax:           +972-9-9576021
 
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.live555.com/pipermail/live-devel/attachments/20090915/7460188c/attachment-0001.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: image/jpeg
Size: 3016 bytes
Desc: not available
URL: <http://lists.live555.com/pipermail/live-devel/attachments/20090915/7460188c/attachment-0001.jpe>
    
    
More information about the live-devel
mailing list