Search code examples
javascriptweblibvlcnw.js

Video length of playlist items Webchimera.js Player


Environment

The following code works but I'm left wondering if it's the best approach. The requirement is to get the length of each video that's in the playlist.

To do that I use the events onPlaying and onPaused.

wjs = require('wcjs-player');

...

chimera_container = new wjs("#chimera_container");
chimera_player = chimera_container.addPlayer({ mute: true, autoplay: false, titleBar: "none" }); 
chimera_player.onPlaying( OnPlaying ); // Pauses player
chimera_player.onPaused( OnPaused ); // Extracts length information

var OnPlaying = function(){
    chimera_player.pause();
 };

var OnPaused = function() {
    console.log( chimera_player.itemDesc(chimera_player.currentItem()).mrl , chimera_player.length());
    if(!chimera_player.next())
        chimera_player.clearPlaylist();
};

At first I tried doing all the code in the event onPlaying but the app always crashed with no error. After checking chimera_player.state() it seemed that even after doing chimera_player.pause() the state didn't change while inside the onPlaying event. I figure having state Playing and trying to do chimera_player.next() causes the exception.

This way seems a bit hacky, but I can't think of another one.


Solution

  • My approach was definitely not the best. @RSATom kindly exposed the function libvlc_media_get_duration in the WebChimera.js API.

    In order to get the duration all that is needed is:

    ... after adding playlist...
    var vlcPlaylist = chimera_player.vlc.playlist;
    for(var i=0, limit=chimera_player.itemCount(); i<limit; ++i  ){
        var vlcMedia = vlcPlaylist.items[i];
        vlcMedia.parse(); // Metadata is not available if not parsed
        if(vlcMedia.parsed)
            // Access duration via --> vlcMedia.duration
        else
            logger("ERROR -- parsePlaylist -- " + vlcMedia.mrl );
    }
    

    If you are going to try to get duration from files with MPEG format then you are in for a headache. In order to have VLC return duration of MPEG file before playing the video, it is necessary that its Demuxer is set to Avformat demuxer. Problem is you can't do that via the libvlc api. If demuxer is not set, then vlcMedia.duration will always return 0.

    There's two options here:

    • Use ffprobe to access video metadata and forget doing it via libvlc
    • Play with this posts' original way of getting duration via a combination of play() pause() events.