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

4
我正在尝试在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个回答

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

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

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 {
    ...
  }
}

大家都要遵循这种方法。这是唯一的解决方案。非常感谢Scott。 - Adib Aroui

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

我很快会重新审视这个问题,但我想知道是否与在服务器上设置流有关。我猜想如果您设置了流,您可能会从getDuration()方法中获得正确的值。 - Redtopia

1

JW Player只会在视频播放时显示持续时间

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

它可以在更多的条件下返回正确的持续时间,而不仅仅是播放。请参见https://gist.github.com/s2t2/45460c06581798ba6e94进行诊断。 - s2t2

0
刚刚告诉大家一个问题,最近我还分析了其他视频播放器,除了YouTube,所有的视频播放器一开始都显示视频时长为00:00:00。很可能是YouTube将时长保存在数据库中并显示出来。
否则,@Scott Evernden的想法更有道理。 http://mediaelementjs.com/http://www.videojs.com/以及大多数其他网站,除了YouTube,时长都是00:00:00。 jwplayer和其他播放器一样,在播放事件之后提供视频时长。

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

    }
},

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
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接