【问题标题】:jwplayer - how do I get video duration before playback?jwplayer - 如何在播放前获取视频时长?
【发布时间】:2016-12-27 19:07:40
【问题描述】:

我试图在 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>

【问题讨论】:

    标签: jwplayer


    【解决方案1】:

    这大概是我处理这个问题的方式:

    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。
    【解决方案2】:

    这是真的。我没有得到任何解决方案,所以我使用了两个事件。 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() 方法中得到正确的值。
    【解决方案3】:

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

    【讨论】:

    【解决方案4】:

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

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

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

    【讨论】:

      【解决方案5】:

      因为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
      
          }
      },
      

      【讨论】:

        【解决方案6】:

        您可以获取玩家准备好的持续时间并获取正确控制器的值,例如:

          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
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-10-12
          • 2012-06-13
          • 1970-01-01
          • 1970-01-01
          • 2015-04-05
          相关资源
          最近更新 更多