[Live-devel] transcoding a videostream

Frank van Eijkelenburg frank.van.eijkelenburg at technolution.nl
Wed Sep 2 02:11:39 PDT 2015


I have some videostreams that are H.264 which needs to be converted to 
MPEG2 for instance. I think that is the media transcoding you mention 
and therefore I wanted to use the libAV library. If I test this as a 
standalone application besides the proxy server, it would be something like:

     libvlc_instance_t *libvlc;
     libvlc_media_t *m;
     libvlc_media_player_t *mp;

     char const *vlc_argv[] =
     {
"--sout=#rtp{sdp=rtsp://192.168.1.101:5678/mjpeg/axis-media/media.amp}",
     };

     int vlc_argc = sizeof(vlc_argv) / sizeof(*vlc_argv);

     /* Load the VLC engine */
     libvlc = libvlc_new (vlc_argc, vlc_argv);

     /* Create a new item */
     m = libvlc_media_new_location (libvlc, 
"rtsp://192.168.1.101:1235/axis-media/media.amp");

     /* Create a media player playing environement */
     mp = libvlc_media_player_new_from_media(m);

     /* No need to keep the media now */
     libvlc_media_release(m);

     /* play the media_player */
*libvlc_media_player_play(mp);*

     for (int i = 0; i < 60; i++) {
         printf(".");
         sleep(1);
         fflush(stdout);
     }

     /* Stop playing */
     libvlc_media_player_stop (mp);

     /* Free the media_player */
     libvlc_media_player_release (mp);

     libvlc_release (libvlc);

This works only if the original stream 
(rtsp://192.168.1.101:1235/axis-media/media.amp) is already started 
before the transcoded stream 
(rtsp://192.168.1.101:5678/mjpeg/axis-media/media.amp) is played.

The above code needs to be integrated in my application which uses the 
LIVE555 library in such a way that the user can directly play the 
"transcoded camerastream" 
(rtsp://192.168.1.101:5678/mjpeg/axis-media/media.amp).

Best regards,

Frank van Eijkelenburg

On 02-09-15 09:34, Ross Finlayson wrote:
>> I am sorry if Iitwasn't clear enough. Your suggestion is exactly what 
>> I want to do: implement my own LIVE555 transcoding filter (based on 
>> libAV). My confusion is about the registering of urls and where to 
>> put the libAV play command. Do I need to register two urls: the 
>> "normal camerastream" and the "transcoded camerastream", or should it 
>> be enough to just use the "transcoded camerastream”?
>
> You create (using “ProxyServerMediaSession::createNew()”) a single 
> “ProxyServerMediaSession” object, with the “rtsp://“ <rtsp://%93> URL 
> for the ‘back-end’ stream, as usual.
>
> However, you also pass - as the last parameter to 
> “ProxyServerMediaSession::createNew()” - a pointer to a 
> “MediaTranscodingTable” object.  See 
> “liveMedia/include/MediaTranscodingTable.hh”.
>
> I.e., you would define your own subclass of “MediaTranscodingTable”, 
> and reimplement - in this subclass - the “lookupTranscoder()” virtual 
> function.  Your “lookupTranscoder()” implementation would look 
> something like the following (e.g., this is what I do in my new WebRTC 
> demo to transcode from MPEG-4 to VP8 video):
>
> //////////
> FramedFilter* 
> MyMediaTranscodingTable::lookupTranscoder(MediaSubsession& inputCodecDescription, char*& outputCodecName) 
> {
>     if (strcmp(inputCodecDescription.codecName(), "MP4V-ES") == 0) {
>       outputCodecName = strDup("VP8");
>       return myMPEG4toVP8VideoTranscoder::createNew(envir(), 
> inputCodecDescription.readSource());
>     } else {
>       outputCodecName = NULL;
>       return NULL;
>     }
>   }
> //////////
>
> In this example, “myMPEG4toVP8VideoTranscoder” is a “FramedFilter” 
> subclass that transcodes MPEG-4 video frames to VP8 video frames.  You 
> would write a similar “FramedFilter” subclass for whatever pair(s) of 
> codecs you want to transcode.  And, of course, you have to implement 
> the transcoding yourself.
>
> In your email, you refer to a “libAV play command”.  I’m not sure what 
> you mean by this, but perhaps you’re referring to the fact that the 
> ‘libAV’ library has its own RTSP client functionality.  Ignore that; 
> it’s crap.  We do all of the RTSP/RTP (at both the back and front ends 
> of our proxy server); you'd use ‘libAV’ (formerly FFMPEG) merely for 
> media transcoding.  (Or, if you have some other way to do transcoding 
> (e.g., in hardware), then you’d use that instead.)
>
>
> Ross Finlayson
> Live Networks, Inc.
> http://www.live555.com/
>
>
>
> _______________________________________________
> live-devel mailing list
> live-devel at lists.live555.com
> http://lists.live555.com/mailman/listinfo/live-devel

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.live555.com/pipermail/live-devel/attachments/20150902/51a987b3/attachment.html>


More information about the live-devel mailing list