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>
4

6 回答 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 {
    ...
  }
}
于 2013-01-24T23:00:48.810 回答
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);
            }       
    );
于 2013-01-02T11:42:13.410 回答
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();
        }
    });
于 2012-10-25T16:16:23.303 回答
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

    }
},
于 2014-07-07T22:55:51.207 回答
0

只是在这个问题上抬头,最近我也分析了其他视频播放器,除了你的管子之外的所有视频播放器都显示视频持续时间最初为 00:00:00 很可能 youtube 正在将持续时间保存在 DB 中并显示它

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

http://mediaelementjs.com/http://www.videojs.com/和除 youtube 之外的大多数其他网站的持续时间为 00:00:00 jwplayer 也像其他播放器一样在播放事件后提供视频持续时间。

于 2013-08-27T12:37:35.273 回答
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
}
于 2016-12-27T11:07:40.327 回答