Conocer la duración del video en VideoLan (VLC) con C#

VLMC-IconTrasteando un poco con el activeX del VLC no encontraba como podía obtener la duración del vídeo que estaba reproduciendo. No tenia que ser muy difícil, es su reproductor se muestra, así que por algún lado tenia que haber una función  que devolviera el dichoso valor.  Encontré una que te devolvía todos los metadatos del vídeo, e incluso la posición actual en la que esta la reproducción del vídeo. Pero nada sobre la duración.

Después de darle varias vueltas, encontré una que, una vez que ha comenzado ha reproducirse el vídeo, nos devuelve esa información. Mientras tanto devuelve 0, lo que me engaño vilmente.

Para poder ver el valor tenemos que capturar el evento.

vVideoLan.MediaPlayerPlaying += vVideoLan_MediaPlayerPlaying;

Este evento salta cuando se pone a reproducir el vídeo.

Dentro de este evento podemos llamar a la función que ya nos devuelve la duración del vídeo.

TimeSpan tDuracionVideo = TimeSpan.FromMilliseconds(vVideoLan.input.Length);

La función «input.Legnth» nos devuelve la duración del vídeo en milisegundos.

Una vez que conocemos la duración del vídeo, podemos pasar ha obtener la posición actual de la reproducción. Esto es más fácil, solo tenemos que capturar el evento.

vVideoLan.MediaPlayerTimeChanged += vVideoLan_MediaPlayerTimeChanged;

Este evento se producirá cada vez que la posición del vídeo cambie, para saber la posición solo tenemos que poner.

int tPosicion = e.time;

Teniendo estos datos, ya se puede hacer la típica barra de progreso para saber cuanto falta para terminar el vídeo.

Pero resulta que tenemos un problema, no se, si es una fallo del VLC o que, pero el valor de «input.Length» y el valor final de «e.time» no son el mismo. El valor final de «e.time», y todas la variantes que se puede obtener para sacar la misma información que he encontrada en el VLC, es unos milisegundos superior. Por lo que si lo ponemos de esta forma en una barra de progresos.

double max = fVideoLan.vVideoLan.input.Length;
pbPlay.Minimum = 0;
pbPlay.Maximum = (int)max;

// en MediaPlayerTimeChanged
pbPlay.Value = (int)fVideoLan.vVideoLan.input.Time;

Al llegar al final del vídeo, nos genera un error que le valor el superior al valor maximo. La diferencia es pequeña, no llega un segundo, por las pruebas que he hecho, ronda los 500 – 800 milisegundos, varia con cada video, no es fija. Por lo que, antes de pasar el valor actual de la posición del vídeo a la barra de progreso, compruebo que el valor sea igual o inferior.

if ( pbPlay.Maximum > vVideoLan.input.Time )
{
    pbPlay.Value = (int)vVideoLan.input.Time;
}

Y así es como lo he solucionado, si alguien sabe como obtener la duración del vídeo de otra forma o como solucionar el problema del desfase de la duración puede dejar un comentario.