[Live-devel] Synchrnozing video and audio using OnDemandServerMediaSubsessions

Ross Finlayson finlayson at live555.com
Thu Oct 2 17:16:13 PDT 2008

>void CH263plusVideoDXFrameSource::setPresentationTime()
>         // Check if this is the first frame we send
>         if (fPresentationTime.tv_sec == 0 && fPresentationTime.tv_usec == 0)
>         {
>                 // This is the first frame, so we set the current time
>                 gettimeofday(&this->fPresentationTime, NULL);
>         }
>         else
>         {
>                 // These are the following  frames, so we set the previous
>presentation time plus the frame duration
>                 fPresentationTime.tv_usec += this->fDurationInMicroseconds;
>                 if(fPresentationTime.tv_usec>=1000000)
>                 {
>                         fPresentationTime.tv_sec++;
>                         fPresentationTime.tv_usec =
>fPresentationTime.tv_usec -                     1000000;
>                 }
>         }

Where does your H.263+ video data come from?  If it comes from a live 
source (i.e., an encoder), then you may run into problems (clock 
drift) by calling "gettimeofday()" just once, and then incrementing 
the time by what you think is the duration of each frame.  Instead, 
you should set the presentation time by calling "gettimeofday()" 
*each time* you get a frame from the encoder, because then you'll be 
giving the frame a time that you know is accurate.

You should do the same thing for audio (again, if it comes from a live source).

(If, however, you're reading audio+video data from a file, you should 
call "gettimeofday()" just once (but you still need to be careful 
about giving both audio and video accurate (i.e., synchronized) 
presentation times.)

	Ross Finlayson
	Live Networks, Inc. (LIVE555.COM)

More information about the live-devel mailing list