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

时间:2016-03-15 16:33:11

标签: javascript web libvlc nw.js

环境

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

为此,我使用事件 onPlaying 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();
};

首先,我尝试在 onPlaying 事件中执行所有代码,但应用程序始终崩溃且没有错误。检查 chimera_player.state()之后,即使在执行了 chimera_player.pause()之后,状态也没有在 onPlaying 事件内部发生变化。我认为状态正在播放并且尝试 chimera_player.next()会导致异常。

这种方式看起来有点黑客,但我想不出另一个。

2 个答案:

答案 0 :(得分:1)

我的方法绝对是最好的。 @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返回持续时间,必须将其 Demuxer 设置为 Avformat demuxer 。问题是你不能通过libvlc api做到这一点。如果未设置分路器,则vlcMedia.duration将始终返回 0

这里有两个选择:

  • 使用ffprobe访问视频元数据,忘记通过libvlc
  • 进行操作
  • 通过play() pause()事件的组合,使用这些帖子获取持续时间的原始方式。

答案 1 :(得分:0)

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

我错了,有可能(使用libvlc_media_get_duration),但它尚未在WebChimera.js API中公开。如果你要在GitHub上为它创建问题,我会添加它。

P.S。:如果您在GitHub上发现已发现崩溃的问题,那将会很棒......

upd:必需的API implemented