【问题标题】:HTML5 Video is not working with AngularJS ng-src tagHTML5 视频不适用于 AngularJS ng-src 标签
【发布时间】:2013-03-21 15:22:50
【问题描述】:

AngularJS ng-src 不适用于此小提琴中的 HTML5 视频元素:http://jsfiddle.net/FsHah/5/

查看视频元素,src 标签被填充了正确的 src uri,但视频无法播放。

这是AngularJS 中的not supported,解决方法是什么?

【问题讨论】:

标签: ajax html angularjs html5-video


【解决方案1】:

这是 AngularJS 中的默认安全预防措施。详情请看:https://docs.angularjs.org/api/ng/service/$sce

要完全禁用“严格上下文转义”,您可以在 app.js 文件中定义它

angular.module('myAppWithSceDisabledmyApp', []).config(function($sceProvider) {
      // Completely disable SCE.  For demonstration purposes only!
      // Do not use in new projects.
      $sceProvider.enabled(false);
    });

但是他们不推荐。但是您可以使用这样的特定控制器:

var myAppControllers = angular.module('myAppControllers', []); ScorpAppControllers.controller('HomeCtrl', ['$scope', 'Home',    function ($scope, Home) {
$scope.Home = Home.query(); }]).config(function($sceProvider) {
$sceProvider.enabled(false); });

【讨论】:

    【解决方案2】:

    目前这似乎是 AngularJS 中的一个错误:https://github.com/angular/angular.js/issues/1352

    <video ng-src="{{src}}" controls></video> 替换源似乎是目前至少将源加载到视频中的唯一方法。希望有人来解决这个问题或提供某种解决方法。

    【讨论】:

    • 我花了一整天的时间,但这个解决方案可以解决问题.. 非常感谢
    【解决方案3】:

    从视频标签中删除源标签并尝试这个..

    <video controls preload=auto ng-src="{{videoURL| trustUrl}}" poster="{{thumbnailUrl}}"></video>
    

    并在您的 Angular 应用程序中创建一个像这样的过滤器

     app.filter("trustUrl", function($sce) {
                return function(Url) {
                    console.log(Url);
                    return $sce.trustAsResourceUrl(Url);
                };
            });
    

    【讨论】:

    • 注意:poster会报错“Not Found”,应该是ng-attr-poster
    【解决方案4】:

    我认为发生的事情是 Angular 在和元素添加到页面后填充 src 属性,因此浏览器会看到 URL 损坏的元素。我使用ng-if 解决了这个问题:

            <video muted ng-if="foo" loop autoplay>
                <source ng-src="{{foo.media.mp4.url}}">
                <source ng-src="{{foo.media.webm.url}}" type="video/webm">
                <img ng-src="{{foo.media.gif.url}}">
            </video>
    

    这使得元素与foo 的存在相关联,foo 是通过 AJAX 调用填充的范围变量。

    【讨论】:

      【解决方案5】:

      只需创建一个过滤器:

      app.filter("trustUrl", ['$sce', function ($sce) {
              return function (recordingUrl) {
                  return $sce.trustAsResourceUrl(recordingUrl);
              };
          }]);
      

      在查看文件中:

      <audio src="{{Your_URL | trustUrl}}" audioplayer controls></audio>
      

      【讨论】:

      • 很好的答案!需要注意的是,视频的代码实际上是 &lt;video controls="controls" name="Video Name" src="{{videoUrl | trustUrl}}"&gt;&lt;/video&gt;
      • @BenjaminConant 给这家伙一枚奖牌!先生,您刚刚救了我的理智!!并且是原始可信过滤器的道具。非常优雅的解决方案。
      • 您能详细说明一下吗?在这个例子中,你在哪里/home 设置了实际的来源?您的示例显示使用音频对象,但问题是询问视频对象。两者的方法相同吗?另外,什么是过滤器?谢谢。
      • @sdd sdei,你能解释一下这里发生了什么吗?
      • 像一个魅力,但请你提供一个解释?
      【解决方案6】:

      您可以使用ng-media 模块。

      angular.module('app', ['media'])
          .controller('mainCtrl', function($scope) {
              
              $scope.videoSources = [];
              
              $scope.loadVideos = function() {
                  $scope.videoSources.push('http://www.w3schools.com/html/mov_bbb.mp4');
                  $scope.videoSources.push('http://www.w3schools.com/html/mov_bbb.webm');
              };
          });
      <div ng-app='app'>
        <div ng-controller='mainCtrl'>        
          <video html5-video='{{ videoSources }}'
              autoplay='true' controls='true'>
          </video>
          <br>
          <a href="#" ng-click='loadVideos()'>Load videos</a>
        </div>
      </div>
      
      <script src="https://code.angularjs.org/1.3.15/angular.js"></script>
      <script src="http://caitp.github.io/ng-media/ng-media.js"></script>

      Plunker.

      【讨论】:

        【解决方案7】:

        只需使用 vanilla js(常规 javascript)即可完成这项工作。 如果您正在收听诸如 onended 之类的事件,您可能需要重新考虑使用 $scope.$apply()。

        我的例子:

        document.getElementById('video').src = $scope.videos[$scope.videoindex];
        

        【讨论】:

          【解决方案8】:

          为了播放视频,我只是使用了以下方法 有一个名为 play 的按钮,在按钮的 ng-click 中你必须写这个

           var myVideo = document.getElementsByTagName('video')[0];
          myVideo.src = vidURL;
          myVideo.load();
          myVideo.play();
          

          要在 ng-repeat 中播放视频,请使用 index。 希望有帮助。

          【讨论】:

          • 谢谢你,这对我有用!在我的情况下,我希望视频自动播放,所以我使用 JS 超时这样做。
          【解决方案9】:

          我的回复晚了几年,但这适用于仍在寻找解决方案的任何人。我遇到过同样的问题。我记得 Youtube 使用不同的标签 - iframe 显示他们嵌入的视频。 我应用了我想要的属性并且它起作用了。

          &lt;iframe width="560" height="300" ng-src="{{ video }}" frameborder="0" allowfullscreen controls&gt;&lt;/iframe&gt;

          对于 AngularJS 的新手,{{ video }} 是该页面控件中的 $scope.video 变量,它具有视频的路径。

          【讨论】:

            【解决方案10】:

            解决方法

            在控制器中

            $scope.mp3 = "http://download.jw.org/audio.mp3"
            
            $scope.$watch('mp3', function() {
                   $("audio").attr("src",$scope.mp3)
               });
            

            html:

            <audio id="mejs" type="audio/mp3" controls="controls"></audio>
            

            【讨论】:

            • 角度等效,没有 jQuery 依赖:angular.element(document.getElementById('audio_element_id')).attr('src', $scope.mp3)
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-12-28
            • 2015-08-09
            • 2023-03-15
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多