播放列表项目的视频长度 Webchimera.js 播放器

Video length of playlist items Webchimera.js Player

环境

以下代码有效,但我想知道它是否是最佳方法。要求是获取播放列表中每个视频的长度。

为此,我使用事件 onPlayingonPaused

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();
};

起初我尝试在 onPlaying 事件中执行所有代码,但应用程序总是崩溃且没有错误。在检查 chimera_player.state() 之后,似乎即使在执行 chimera_player.pause() 之后,状态在内部也没有改变onPlaying 事件。我认为状态 Playing 并尝试执行 chimera_player.next() 会导致异常。

这种方式似乎有点hacky,但我想不出另一种方式。

我尝试在 libvlc 中找到任何函数 API 允许在不播放的情况下获取媒体长度 - 但没有成功。所以很可能没有办法在不播放的情况下获得媒体长度。

我错了,这是可能的(libvlc_media_get_duration),但它还没有在 WebChimera.js API 中公开。如果您要在 GitHub.

上创建问题,我会添加它

P.S.: 如果你能在 GitHub 上为发现的崩溃创建问题,那就太好了...

更新:需要 API implemented

我的方法绝对不是最好的。 @RSATom 在WebChimera.js API 中公开了函数libvlc_media_get_duration

为了获得持续时间,只需:

... 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 );
}

如果您要尝试从 MPEG 格式的文件中获取持续时间,那么您会很头疼。为了在播放视频之前拥有 MPEG 文件的 VLC return 持续时间,有必要将其 Demuxer 设置为 Avformat demuxer .问题是你不能通过 libvlc api 做到这一点。如果未设置 demuxer,则 vlcMedia.duration 将始终 return 0

这里有两个选项:

  • 使用 ffprobe 访问视频元数据而忘记通过 libvlc
  • 通过 play() pause() 事件的组合来尝试这个帖子的原始方式来获取持续时间。