2016-12-27 3 views
1

Я пытаюсь использовать modularjs/ngDialog для отображения диалогового окна видеопроигрывателя Bitmovin. Пример кода ниже загружает и воспроизводит видео. Проблема возникает, когда я закрываю диалог, используя кнопку закрытия или щелкнув по области фона, а затем попытаюсь открыть диалоговое окно/плеер. Игрок не загружается и не играет. В идеале я хотел бы, чтобы игрок поднял место, где он остановился. Когда я использую JWPlayer с тем же кодом angularjs/ngDialog, видео воспроизводит второй, третий, ... раз.Проблема с использованием angularjs/ngDialog modal с проигрывателем Bitmovin

Я новичок в angularjs. Любая помощь приветствуется.

<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <title>** Bitmovin AngularJS Modal Player</title> 
    <meta charset="UTF-8"/> 
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> 
    <meta name="viewport" content="width=device-width, initial-scale=1.0"> 

    <link rel='stylesheet' href='css/ngDialog.css' type='text/css' media='all' /> 
    <link rel='stylesheet' href='css/ngDialog-theme-default.css' type='text/css' media='all' /> 

    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.4/jquery.min.js"></script> 
    <script type='text/javascript' src='http://ajax.googleapis.com/ajax/libs/angularjs/1.5.8/angular.min.js?ver=1.5.8'></script> 
    <script type='text/javascript' src='http://cdnjs.cloudflare.com/ajax/libs/ng-dialog/0.6.4/js/ngDialog.min.js?ver=0.6.4'></script> 
    <script type="text/javascript" src="https://bitmovin-a.akamaihd.net/bitmovin-player/stable/6.1.7/bitmovinplayer.min.js"></script> 
</head> 
<body> 

<div class="container"> 
    <div class="content"> 
     <div ng-app="myApp" ng-controller="myModalController"> 
      <button ng-click="showVideoPlayerPopup()" class="btmv-button">WATCH</button> 
     </div> 
    </div> 
</div> 

<script type="text/javascript"> 

function playVideo() { 
//var createPlayer = function() { 
    var config = { 
     key: "0b3b8038-7b11-4aa0-8717-1f848c76e436", 
     source: { 
      dash: 'https://bitmovin-a.akamaihd.net/content/MI201109210084_1/mpds/f08e80da-bf1d-4e3d-8899-f0f6155f6efa.mpd' 
     }, 
     style: { 
      width: '50vw', 
      aspectratio: '16/9' 
     }, 
     playback : { 
      autoplay : true, 
      muted  : false 
     }, 
     events: { 
      onReady: function(data) { 
       console.log('Video duration: ' + this.getDuration() + "s"); 
       console.log(data); 
      }, 
      onPlay : function(data) { 
       console.log(data); 
      }, 
      onPause : function(data) { 
       console.log(data); 
      }, 
      onSeek : function(data) { 
       //updateTime(); 
       console.log(data); 
      }, 
      onPlaybackFinished: function(data) { 
       console.log('Video onPlaybackFinished: ' + this.getCurrentTime() + "s", data); 
       player.seek(0); 
       console.log('Video onPlaybackFinished seek(0) time: ' + this.getCurrentTime() + "s"); 
//    player.destroy(); 
//    console.log('TGC Video onPlaybackFinished player destroyed! '); 
      }, 
      onError : function(data) { 
       console.error("Bitmovin Player error: " + data.code + ": " + data.message); 
      } 
     } // end events 
    }; 

    var player = bitmovin.player('btmv-player'); 

    player.setup(config).then(function(value) { 
     console.log('Successfully created Bitmovin Player instance'); 
    }, function(reason) { 
     console.log('Error while creating Bitmovin Player instance: ${error.message}'); 
    }); 

    function updateTime(time) { 
     document.getElementById("event").innerHTML ="The video has been seeked to "+JSON.stringify(player.getCurrentTime())+"s"; 
    } 
    player.addEventHandler('onSeeked', function(timestamp) { 
     updateTime(JSON.stringify(player.getCurrentTime())); 
    }); 

}; 

function playbackFinished() { 
    console.log('playbackFinished fired! '); 
} 

function killPlayer() { 
    if (confirm('Close the player?')) { 
     player.destroy(); 
     return true; 
    } 
    return false; 
} 

var app = angular.module('myApp',['ngDialog']); 

app.controller('myModalController', function($scope, ngDialog) { 
    $scope.ngDialog = ngDialog; 
    $scope.showVideoPlayerPopup = function(video_path) { 
     ngDialog.open({ 
      //animation : true, 
      disableAnimation: true, 
      scope  : $scope, 
      template: '<div id="btmv-player"></div>' + 
         '<br />' + 
         '<div id="event"></div>', 
      plain  : true, 
      className : 'ngdialog-theme-default', 
      closeByDocument: true, 
      width  : 670, 
      height  : 390, 
      preCloseCallback: function(value) { 
       //killPlayer(); 
       return true; 
      } 
     }); 
     $scope.$on('ngDialog.opened', function (e, $dialog) { 
      playVideo(); 
      //createPlayer(); 
      console.log('ngDialog opened: ' + $dialog.attr('id')); 
     }); 
     $scope.$on('ngDialog.closing', function (e, $dialog) { 
      //killPlayer(); 
      console.log('ngDialog closing: ' + $dialog.attr('id')); 
     }); 
     $scope.$on('ngDialog.closed', function (e, $dialog) { 
      //killPlayer(); 
      console.log('ngDialog closed: ' + $dialog.attr('id')); 
     }); 
    } 
}); 
</script> 

</body> 
</html> 

ответ

2

кажется, что проблема заключается в том, что игрок <div> не существует больше при вызове bitmovin.player("btmv-player") в killPlayer.

Следующий код должен работать. Он использует короткий отрезок bitmovin.player() вместо доступа через ID, который возвращает последнего созданного игрока.

<html lang="en"> 
<head> 
    <title>** Bitmovin AngularJS Modal Player</title> 
    <meta charset="UTF-8"/> 
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> 
    <meta name="viewport" content="width=device-width, initial-scale=1.0"> 

    <link rel='stylesheet' href='https://cdnjs.cloudflare.com/ajax/libs/ng-dialog/0.6.4/css/ngDialog.css' type='text/css' media='all' /> 
    <link rel='stylesheet' href='https://cdnjs.cloudflare.com/ajax/libs/ng-dialog/0.6.4/css/ngDialog-theme-default.css' type='text/css' media='all' /> 

    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.4/jquery.min.js"></script> 
    <script type='text/javascript' src='http://ajax.googleapis.com/ajax/libs/angularjs/1.5.8/angular.min.js?ver=1.5.8'></script> 
    <script type='text/javascript' src='http://cdnjs.cloudflare.com/ajax/libs/ng-dialog/0.6.4/js/ngDialog.min.js?ver=0.6.4'></script> 
    <script type="text/javascript" src="https://bitmovin-a.akamaihd.net/bitmovin-player/stable/7/bitmovinplayer.js"></script> 
</head> 
<body> 

<div class="container"> 
    <div class="content"> 
     <div ng-app="myApp" ng-controller="myModalController"> 
      <button ng-click="showVideoPlayerPopup()" class="btmv-button">WATCH</button> 
     </div> 
    </div> 
</div> 

<script type="text/javascript"> 

function playVideo() { 
    var config = { 
     key: "YOUR-PLAYER-KEY", 
     source: { 
      dash: 'https://bitmovin-a.akamaihd.net/content/MI201109210084_1/mpds/f08e80da-bf1d-4e3d-8899-f0f6155f6efa.mpd' 
     }, 
     style: { 
      width: '50vw', 
      aspectratio: '16/9' 
     }, 
     playback : { 
      autoplay : true, 
      muted  : false 
     }, 
     events: { 
      onReady: function(data) { 
       console.log('Video duration: ' + this.getDuration() + "s"); 
       console.log(data); 
      }, 
      onPlay: function(data) { 
       console.log(data); 
      }, 
      onPaused: function(data) { 
       console.log(data); 
      }, 
      onSeek : function(data) { 
       console.log(data); 
      }, 
      onPlaybackFinished: function(data) { 
       console.log('Video onPlaybackFinished: ' + this.getCurrentTime() + "s", data); 
       player.seek(0); 
       console.log('Video onPlaybackFinished seek(0) time: ' + this.getCurrentTime() + "s"); 
      }, 
      onError : function(data) { 
       console.error("Bitmovin Player error: " + data.code + ": " + data.message); 
      } 
     } // end events 
    }; 

    var player = bitmovin.player('btmv-player'); 

    player.setup(config).then(function(value) { 
     console.log('Successfully created Bitmovin Player instance'); 
    }, function(reason) { 
     console.log('Error while creating Bitmovin Player instance: ${error.message}'); 
    }); 

    function updateTime(time) { 
     document.getElementById("event").innerHTML ="The video has been seeked to "+JSON.stringify(player.getCurrentTime())+"s"; 
    } 

    player.addEventHandler('onSeeked', function(timestamp) { 
     updateTime(JSON.stringify(player.getCurrentTime())); 
    }); 
}; 

function playbackFinished() { 
    console.log('playbackFinished fired! '); 
} 

function killPlayer() { 
    if (confirm('Close the player?')) { 
     var player = bitmovin.player(); 
     if (player) { 
      player.destroy(); 
     } 
     return true; 
    } 
    return false; 
} 

var app = angular.module('myApp',['ngDialog']); 

app.controller('myModalController', function($scope, ngDialog) { 
    $scope.ngDialog = ngDialog; 
    $scope.showVideoPlayerPopup = function(video_path) { 
     ngDialog.open({ 
      disableAnimation: true, 
      scope  : $scope, 
      template: '<div id="btmv-player"></div>' + 
         '<br />' + 
         '<div id="event"></div>', 
      plain  : true, 
      className : 'ngdialog-theme-default', 
      closeByDocument: true, 
      width  : 670, 
      height  : 390 
     }); 
    } 

    $scope.$on('ngDialog.opened', function (e, $dialog) { 
     playVideo(); 
     console.log('ngDialog opened: ' + $dialog.attr('id')); 
    }); 

    $scope.$on('ngDialog.closed', function (e, $dialog) { 
     killPlayer(); 
     console.log('ngDialog closed: ' + $dialog.attr('id')); 
    }); 
}); 
</script> 

</body> 
</html> 

Кроме того, я предлагаю не смешивая AngularJS и обычный JavaScript, как странные вещи могут произойти, особенно если проект растет. Вы должны рассмотреть возможность добавления всего кода JavaScript в приложение/контроллеры.

Там также проект Github использовать Bitmovin Player в угловых (поддерживается MovingImage24 и не Bitmovin): https://github.com/MovingImage24/mi-angular-bitdash-player я не уверен, как до настоящего времени она сохраняется, хотя.