Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using libVLC as a video decoder

Tags:

c++

c

decode

libvlc

I'm attempting to use libVLC as a video decoder for a motion detection project. Previously I was using ffmpeg libraries, but some issues with Matroska files brought me here. Along with playing video back at the correct rate, I also want to be able to get one frame after another at the fastest rate my system can handle, as once the user sets up some parameters, I want the motion detection algorithm to run through the video as quickly as it can. My libVLC setup code looks like this (error handling and minor details omitted for brevity):

const char* vlc_argv[] =
{
    "--no-audio", /* skip any audio track */
};
libvlc_instance_t* inst = libvlc_new(sizeof(vlc_argv) / sizeof(*vlc_argv), vlc_argv);
auto media = libvlc_media_new_path (inst, filename.c_str());
player = libvlc_media_player_new_from_media(media);
libvlc_media_release(media);

// Needed to initialize the player ?
libvlc_media_player_play(player);
libvlc_media_player_pause(player);

fps = libvlc_media_player_get_fps(player);
length = libvlc_media_player_get_length(player);
width = libvlc_video_get_width(player);
height = libvlc_video_get_height(player);

// TODO: Add libvlc_video_set_callbacks to set up callbacks to render to memory buffer

However, I am left with the following questions:

  1. Is there a more straightforward way to initialize the media player without starting playback besides calling libvlc_media_player_play then libvlc_media_player_pause?
  2. All of the get functions (fps, length, width, height) all return zero. Do I need to do something like read the first frame to get these values, and if so, how am I supposed to know how large my decoded frame buffer must be?
like image 687
Matt Kline Avatar asked Sep 01 '26 16:09

Matt Kline


1 Answers

From a VLC developer:

  1. The regular playback system is really not meant for unpaced decoding. You'd need to use stream output, for which there is no programmable API as yet.

  2. get calls are returning zero because you need to wait until the tracks are created.

like image 136
Matt Kline Avatar answered Sep 03 '26 07:09

Matt Kline



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!