[Lazarus] PasLibVLC based video player does not run on Linux...

Bo Berglund bo.berglund at gmail.com
Tue Nov 21 19:29:58 CET 2023

On Tue, 21 Nov 2023 18:05:22 +0100 (CET), Michael Van Canneyt via lazarus
<lazarus at lists.lazarus-ide.org> wrote:

>On Tue, 21 Nov 2023, Bo Berglund via lazarus wrote:
>Where did you find paslibvlc ?

I found it here years ago:


And the first commit to my video tool in svn using it was done in May 2019...

>The one I maintain is part of FPC and is in fpc/packages/libvlc.

Yes and a few days ago I found it to be a part of fpc/lazarus and that made me
try to see if I could find all the stuff I have used in paslibvlc also here so I
could just exchange the player and modify the calls.

Makes much more sense to use a package that is in effect maintained than one
that is stale on the net.

>> I have tried replacing PasLibVlc with LclVlc shipped with Lazarus but I am
>> missing a couple of items that I use during playback (varying play speed and
>> audio shift for lipsync), which PasLibVlc does expose.
>It should not be difficult to add those properties to lclvlc

If one knows how it is done internally I guess it is doable but for me not...
But I can trace what I use backwards into PasLibVlc and see where it finally
ends up. So:

--------- Delay audio ------------------------
I call the audio delay like this:

procedure TfrmMain.btnShiftAudioClick(Sender: TObject);
//For testing purposes, delay audio by value from speAudio
  SyncCmd: string;
  vlcPlayer.SetAudioDelay(speAudio.Value * 1000);

which calls this inside PasLibVlc:

procedure TPasLibVlcPlayer.SetAudioDelay(delay: Int64);
  if not Assigned(p_mi) then exit;
  libvlc_audio_set_delay(p_mi, delay);

and this is where it ends up:

 * Set current audio delay. The audio delay will be reset to zero each time the
media changes.
 * param p_mi media player
 * param i_delay the audio delay (microseconds)
 * return 0 on success, -1 on error
 * version LibVLC 1.1.1 or later
  libvlc_audio_set_delay : function(
    p_mi    : libvlc_media_player_t_ptr;
    i_delay : Int64
  ) : Integer; cdecl;

------------- Set video speed -----------------------
To set the speed this is what I use in my code:
procedure TfrmMain.btnFFClick(Sender: TObject);

It goes here:

procedure TPasLibVlcPlayer.SetPlayRate(rate: Integer);
  if (p_mi = NIL) then exit;
  if (rate < 1) then exit;
  if (rate > 1000) then exit;  
  libvlc_media_player_set_rate(p_mi, rate / 100);

And it winds up here:

 * Set movie play rate
 * param p_mi the Media Player
 * param rate movie play rate to set
 * return  -1 if an error was detected, 0 otherwise (but even then, it might
 * not actually work depending on the underlying media protocol)

  libvlc_media_player_set_rate : function(
    p_mi : libvlc_media_player_t_ptr;
    rate : Single // float
  ) : Integer; cdecl;

>> What are the requirements for the executable's environment for it to find the
>> libvlc files?
>Notmally nothing.
>> And is it necessary for them to be there for the building process only or for
>> the end user's execution too?
>libvlc is loaded dynamically, you can specify the name.

Well, for lclvlc there are no problems because it finds the lib on the platforms
I have tested it. Both RPi4 versions (32 and 64 bit) and Windows10.


Thanks again!

Nice to communicate with someone "in the know" for once!

Bo Berglund
Developer in Sweden

More information about the lazarus mailing list