[Live-devel] Subject: MJPEG streaming server and packet fragmentation

Ross Finlayson finlayson at live555.com
Thu Apr 27 10:54:18 PDT 2017


To begin, I assume that you have already read
	http://live555.com/liveMedia/faq.html#jpeg-streaming
which explains why streaming MJPEG over RTP is usually a bad idea.


> http://imgur.com/a/ApaBy
> 
> In this particular case I was trying to stream a JPEG with approximately 40kB of payload. If I understand correctly, it looks like
> only the first network packet containing this JPEG frame is being taken into account, and the rest is just discarded, so that's
> why the image is distorted this way.
> 
> The question is - what I'm doing wrong?

I’m not sure.  In this case network packet loss is *not* the problem, because (as I explain in the link above) if a network packet were lost, then *none* of the JPEG image would have been reconstructed at the receiving end.  Therefore, I think that the problem is VLC; for some reason, it does not seem to be rendering the entire JPEG image correctly, even though it will have received it all.  I would start by making sure that you’re using an up-to-date version of VLC; see http://www.videolan.org/vlc

Another thing that I’d do is try using our command-line RTSP client “openRTSP” (see <http://www.live555.com/openRTSP/>) rather than VLC as the receiving client.  If you run “openRTSP” with the “-m” option, it should output a series of files, one for each video frame.  If you rename each of these files to have a “.jpg” filename suffix, then you should be able to view each file (using normal image viewer software).


One more thing.  Instead of doing this:

>    memcpy(fTo, SPACE_JPG + offset, SPACE_JPG_len -⁠ offset);
> 
>    fFrameSize = SPACE_JPG_len -⁠ offset;

You should check to make sure that you have enough space available to do the copy (although, in your case, it appears that you do).  Instead, to be safer, do this:

	fFrameSize = SPACE_JPG_len -⁠ offset;
	if (fFrameSize > fMaxSize) {
		fNumTruncatedBytes = fFrameSize - fMaxSize;
		fFrameSize = fMaxSize;
	}
	memcpy(fTo, SPACE_JPG + offset, fFrameSize);


Ross Finlayson
Live Networks, Inc.
http://www.live555.com/




More information about the live-devel mailing list