播放列表项目的视频长度 Webchimera.js 播放器
Video length of playlist items Webchimera.js Player
环境
- NW.js v0.12.3
- io.js v1.2.0
- 32 位
- Windows 8
- Webchimera.js (player)
以下代码有效,但我想知道它是否是最佳方法。要求是获取播放列表中每个视频的长度。
为此,我使用事件 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 事件。我认为状态 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()
事件的组合来尝试这个帖子的原始方式来获取持续时间。
环境
- NW.js v0.12.3
- io.js v1.2.0
- 32 位
- Windows 8
- Webchimera.js (player)
以下代码有效,但我想知道它是否是最佳方法。要求是获取播放列表中每个视频的长度。
为此,我使用事件 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 事件。我认为状态 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()
事件的组合来尝试这个帖子的原始方式来获取持续时间。