jwplayer - 如何在播放前获得视频时长?

时间:2012-07-11 17:22:42

标签: jwplayer

我正在尝试在jwplayer开始播放之前获取视频的持续时间。我尝试在onReady事件回调中调用getDuration(),但它返回-1。当我在onPlay事件回调中调用getDuration()时,我得到正确的值。有什么想法吗?

这是我的代码:

<video src="movie.mp4" id="video" width="800" height="600"></video>
<script type="text/javascript">
jwplayer ('video').setup ({
    flashplayer: '/js/mediaplayer-5.10/player.swf',
    width: 600,
    height: 400,
    events: {
        onReady: function () {
            var duration = this.getDuration();
            alert ('ready, duration: ' + duration);
        },
        onPlay: function (state) {
            alert ('play, duration: ' + this.getDuration());
        }
    }
});
</script>

6 个答案:

答案 0 :(得分:5)

这大致是我处理这个问题的方法:

var duration = 0;
jwplayer().onReady(function() {
  if (duration == 0) {
    // we don't have a duration yet, so start playing
    jwplayer().play();
  }
});

jwPlayer().onTime(function() {
  if (duration == 0) {
    // we don't have a duration, so it's playing so we can discover it...
    duration = jwplayer().getDuration();
    jwplayer().stop();
    // do something with duration here
  } else {
    ...
  }
}

答案 1 :(得分:3)

这是真的。我没有得到任何解决方案因此我使用了两个事件。 OnBuffer和OnPlay如下。它在第一个事件中提供-1,在第二个事件中提供实际长度。它可能会有所帮助。好吧,如果退出,我正在寻找任何其他解决方案。

           var duration;  
           jwplayer().onBuffer(function () {
            duration = this.getDuration();              
            alert(duration);
            }       
    );

    jwplayer().onPlay(function () {
            if(duration==-1)
            duration=this.getDuration();
            alert(duration);
            }       
    );

答案 2 :(得分:1)

JW播放器仅显示播放视频时的持续时间

$.each(all_video_ids, function(video_idx, video_id){
        console.log(video_id);
        var temp_video = jwplayer(video_id);

        var metaData = temp_video.getMeta();
        console.log(metaData);
        console.log(temp_video);
        console.log(temp_video.getDuration());

        if(temp_video.getState() == "PLAYING"){
            temp_video.pause();
        }
    });

答案 3 :(得分:0)

刚刚在这个问题中抬头我们最近我分析了其他视频播放器以及除了你管之外的所有视频播放器最初显示的视频时长为00:00:00 很可能youtube正在DB中保存持续时间并显示它

否则@Scott Evernden的想法更有意义

http://mediaelementjs.com/http://www.videojs.com/以及除youtube以外的其他网站的持续时间为00:00:00 jwplayer也喜欢其他玩家在播放事件后提供视频时长。

答案 4 :(得分:0)

由于getDuration似乎不起作用,除非视频正在播放(即使暂停时也是如此)。我这样做:

onPlay: function(){
    var obj = this; //save a reference to 'this' jw object for reference in the setInterval callback.
    if (!obj.playBegan){ //we only want this to trigger once when play begins (not on seek or ffd)
        obj.playBegan = true;
        obj.durationProcessor = setInterval(function(){
             if (obj.getDuration() !== -1){ //sometimes the movie duration isn't immediately available.
                 clearTimeout(obj.durationProcessor);
                 console.log(obj.getDuration());
             }
        }, 250); //look for a duration every .25 seconds

    }
},

答案 5 :(得分:0)

你可以获得玩家准备好的持续时间并获取右控制器的值,如:

  var duration = $('.jw-group.jw-controlbar-right-group.jw-reset')[0];
  var spanText = $(duration).children('.jw-text.jw-reset.jw-text-duration')
  youTubeVideoDuration = ($(spanText)[0]);

它会从玩家那里获取持续时间 如果你想把它转换成相对时间,即以秒为单位,那么你可以使用函数

function toseconds(hms) {
var a = hms.split(':'); // split it at the colons
if (a.length == 3)
    return ((+a[0]) * 60 * 60 + (+a[1]) * 60 + (+a[2])); // if video is in hrs
else
    return ((+a[0]) * 60 + (+a[1])); // video is in minutes
}