Search code examples
c++rtsprtplibvlc

Saving a video using LIBVLC


Hi
I need to stream a video file and save it using LIBVLC. Here is what I have done so far:

libvlc_media_t* vlcMedia = nullptr;
libvlc_instance_t* vlcInstance = libvlc_new(0, nullptr);
vlcMedia = libvlc_media_new_location(vlcInstance, aUri);
if(nullptr != vlcMedia)
{
    libvlc_media_player_t* vlcMediaPlayer = libvlc_media_player_new_from_media(vlcMedia);
    if(nullptr != vlcMediaPlayer)
    {
        libvlc_media_release(vlcMedia);
        libvlc_event_manager_t* vlcMediaManager = libvlc_media_player_event_manager(vlcMediaPlayer);
        if(nullptr != vlcMediaManager)
            libvlc_event_attach(vlcMediaManager, libvlc_MediaPlayerEndReached, OnStopped, this);
        libvlc_media_player_set_hwnd(vlcMediaPlayer, Handle);
        libvlc_media_player_play(vlcMediaPlayer);
    }
}

This will connect to the remote media and starts playing the video. The question is how do I direct it to save the video? I could not find the API call for that.

Thank you
Sam

Thanks to @mtz the solution is to add:

libvlc_media_add_option(vlcMedia,":sout=#duplicate{dst=display,dst=std{access=file,mux=mp4,dst=xyz.mp4}");

after the call to libvlc_media_new_location.


Solution

  • Here's a C# version that you can easily adapt to C/C++

    var currentDirectory = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);
    var destination = Path.Combine(currentDirectory, "record.ts");
    
    // Load native libvlc library
    Core.Initialize();
    
    using (var libvlc = new LibVLC())
    using (var mediaPlayer = new MediaPlayer(libvlc))
    {
        // Redirect log output to the console
        libvlc.Log += (sender, e) => Console.WriteLine($"[{e.Level}] {e.Module}:{e.Message}");
    
        // Create new media with HLS link
        var media = new Media(libvlc, "http://hls1.addictradio.net/addictrock_aac_hls/playlist.m3u8", FromType.FromLocation);
    
        // Define stream output options. 
        // In this case stream to a file with the given path and play locally the stream while streaming it.
        media.AddOption(":sout=#file{dst=" + destination + "}");
        media.AddOption(":sout-keep");
    
        // Start recording
        mediaPlayer.Play(media);
    
        Console.WriteLine($"Recording in {destination}");
        Console.WriteLine("Press any key to exit");
        Console.ReadKey();
    }