javascript - 如何以 angularjs 方式将视频的 src 更改为 blob?

标签 javascript angularjs html5-video webrtc

我有一个 angularjs 设置,例如:

HTML:

<div ng-app="myApp">
  <div ng-controller="Ctrl">
   <span>{{config.localvideo}}</span>
     <video id="video" autoplay>    </video>
     <button ng-click="click()">Start</button>
  </div>
</div>

JavaScript 文件:

.controller('Ctrl', function($scope,$window){
 $scope.config = {localvideo:""} ;
  $scope.click = function(){
    navigator.webkitGetUserMedia( {video:true},function (stream) {
    var video = document.getElementById("video");
    video.src = $window.URL.createObjectURL(stream);
    $scope.config = {localvideo: video.src};
        $scope.$apply();
    },function (error) {
    console.log(error); 
    });
 }
});

这按预期工作:当页面加载时,视频只是一个黑色矩形。当我单击按钮时,我必须授予相机权限,然后视频会显示相机。 span 显示了 blob url,这样我就可以看到它的发生。

但是,据我了解,这不是 angularjs 的方式。我不应该使用 document.getElementById 或类似的东西,我应该更改 $scope 中的对象,并且 html 元素应该通过 ng-src 的 Angular 魔法进行更新。 我认为 JavaScript 应该可以工作:

.controller('Ctrl', function($scope,$window){
 $scope.config = {localvideo:""} ;
  $scope.click = function(){
    navigator.webkitGetUserMedia( {video:true},function (stream) {
        $scope.config = {localvideo: $window.URL.createObjectURL(stream)};
        $scope.$apply();
    },function (error) {
    console.log(error); 
    });
 }
});

如果我使用这个,向我的视频标签添加一个属性: ng-src="config.localvideo",我希望 $scope.config 发生变化,ng-src 会选择它,视频也会开始玩。这不会发生。然而,单击按钮时跨度会更新,因此 $scope.config 似乎已正确更新。谁能解释一下发生了什么,或者没有发生什么?

感谢您的帮助。 注意:我直接使用 chrome 版本的 getUserMedia,而不是垫片,只是为了简洁和健全性检查。

最佳答案

要以“Angular Way”执行此操作,您需要编写自己的指令。在指令中访问 DOM 是安全的,因为它们有一个 link 函数,您可以将其视为该特定元素的一种 document.ready 。在链接函数中,您知道 Angular 已完成 DOM 的创建。传递到下面链接函数的“元素”将是您应用此指令的任何内容,而不是使用 getElementById。

.directive("myStream", function(){
   return {        
      restrict: 'A',
      scope:{config:'='},
      link: function(scope, element, attributes){
       //Element is whatever element this "directive" is on
       navigator.webkitGetUserMedia( {video:true},function (stream) {
         element.src = $window.URL.createObjectURL(stream);
         scope.config = {localvideo: element.src};
         scope.$apply(); //sometimes this can be unsafe.
       });
      }
   }

}

现在,在您的视频项目上,您只需添加“my-stream”作为属性并将其传递给 config="config"。

<video my-stream config="config" /> {{config.localVideo}}

关于javascript - 如何以 angularjs 方式将视频的 src 更改为 blob?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21117124/

相关文章:

javascript - 如何将 jade-agents (java) 和 babylon.js (html/javascript) - Servlet 连接到 html?

javascript - 如何在 HTML 中调用外部 JavaScript 函数

javascript - 如何在 typescript 中导入 template.html

javascript - 使用视频中的帧作为 videoJS 中的预览海报

javascript - HTML5 : Video tag change video time display from MM:SS to HH:MM:SS

javascript - Discord.js API 中的权限?

javascript - 用于比较具有变音符号和非变音变体的字符串的正则表达式

javascript - 在 ng-repeat 中使用 ng-class 更改类

javascript - 在尝试测试返回的数据之前,如何对 PhantomJS 进行编程以等待 AngularJS $resource 解析?

javascript - 我如何将更多视频源添加到我的 javascript 代码中?