在flex slider angularjs中单击新的视频幻灯片时,暂停当前播放的YouTube视频

在flex slider angularjs中单击新的视频幻灯片时,暂停当前播放的YouTube视频,angularjs,youtube,flexslider,Angularjs,Youtube,Flexslider,我正在使用来自此链接的ng youtube嵌入插件。我的网站上安装了flex slider。视频显示在flex slider分区中。请参见所附图像 <flex-slider slider-id="slider" flex-slide="item in videos track by $index" animation="fade" animation-loop="false" sync="#carousel" slideshow="false" control-nav="f

我正在使用来自此链接的ng youtube嵌入插件。我的网站上安装了flex slider。视频显示在flex slider分区中。请参见所附图像

        <flex-slider slider-id="slider" flex-slide="item in videos track by $index" animation="fade" animation-loop="false" sync="#carousel" slideshow="false" control-nav="false" init-delay="100">

          <li>
            <ng-youtube-embed
                video="item.id"
                videoid = "myvideo"
                autoplay="false"
                color="white"
                width="1280px"
                height="650px"
                disablekb="true"
                modestbranding="true"
                end="400"
                enablejsapi="true"
                onready="playerReady"
                onstatechange="stateChanged"
                >
            </ng-youtube-embed>
          </li>

        </flex-slider>
      </div>
      <div class="col-sm-12">

        <flex-slider class="stop" slider-id="carousel" flex-slide="item in videos track by $index" animation="slide" animation-loop="false" item-width="210" item-margin="5" as-nav-for="#slider" slideshow="false" control-nav="false">
          <li>
            <md-card>
                 <img ng-src="https://img.youtube.com/vi/{{item.id}}/hqdefault.jpg" class="md-card-image"/>
                <md-content>
                 <md-card-title>
                   <md-card-title-text><span class="md-headline">{{item.title}}</span></md-card-title-text>
                 </md-card-title>
                 <md-card-content>
                   {{item.description}}
                </md-card-content>
              </md-content>
            </md-card>
          </li>
        </flex-slider>
      </div>
    </div>
  </div>`
当我播放一个视频,然后单击旋转木马中的其他视频时,先前播放的视频不会暂停。我在下面附上我的html代码:-

        <flex-slider slider-id="slider" flex-slide="item in videos track by $index" animation="fade" animation-loop="false" sync="#carousel" slideshow="false" control-nav="false" init-delay="100">

          <li>
            <ng-youtube-embed
                video="item.id"
                videoid = "myvideo"
                autoplay="false"
                color="white"
                width="1280px"
                height="650px"
                disablekb="true"
                modestbranding="true"
                end="400"
                enablejsapi="true"
                onready="playerReady"
                onstatechange="stateChanged"
                >
            </ng-youtube-embed>
          </li>

        </flex-slider>
      </div>
      <div class="col-sm-12">

        <flex-slider class="stop" slider-id="carousel" flex-slide="item in videos track by $index" animation="slide" animation-loop="false" item-width="210" item-margin="5" as-nav-for="#slider" slideshow="false" control-nav="false">
          <li>
            <md-card>
                 <img ng-src="https://img.youtube.com/vi/{{item.id}}/hqdefault.jpg" class="md-card-image"/>
                <md-content>
                 <md-card-title>
                   <md-card-title-text><span class="md-headline">{{item.title}}</span></md-card-title-text>
                 </md-card-title>
                 <md-card-content>
                   {{item.description}}
                </md-card-content>
              </md-content>
            </md-card>
          </li>
        </flex-slider>
      </div>
    </div>
  </div>`
`

        <flex-slider slider-id="slider" flex-slide="item in videos track by $index" animation="fade" animation-loop="false" sync="#carousel" slideshow="false" control-nav="false" init-delay="100">

          <li>
            <ng-youtube-embed
                video="item.id"
                videoid = "myvideo"
                autoplay="false"
                color="white"
                width="1280px"
                height="650px"
                disablekb="true"
                modestbranding="true"
                end="400"
                enablejsapi="true"
                onready="playerReady"
                onstatechange="stateChanged"
                >
            </ng-youtube-embed>
          </li>

        </flex-slider>
      </div>
      <div class="col-sm-12">

        <flex-slider class="stop" slider-id="carousel" flex-slide="item in videos track by $index" animation="slide" animation-loop="false" item-width="210" item-margin="5" as-nav-for="#slider" slideshow="false" control-nav="false">
          <li>
            <md-card>
                 <img ng-src="https://img.youtube.com/vi/{{item.id}}/hqdefault.jpg" class="md-card-image"/>
                <md-content>
                 <md-card-title>
                   <md-card-title-text><span class="md-headline">{{item.title}}</span></md-card-title-text>
                 </md-card-title>
                 <md-card-content>
                   {{item.description}}
                </md-card-content>
              </md-content>
            </md-card>
          </li>
        </flex-slider>
      </div>
    </div>
  </div>`
这种逻辑有时会起作用。 大多数情况下,我会在控制台中看到以下错误。检查附加的图像

        <flex-slider slider-id="slider" flex-slide="item in videos track by $index" animation="fade" animation-loop="false" sync="#carousel" slideshow="false" control-nav="false" init-delay="100">

          <li>
            <ng-youtube-embed
                video="item.id"
                videoid = "myvideo"
                autoplay="false"
                color="white"
                width="1280px"
                height="650px"
                disablekb="true"
                modestbranding="true"
                end="400"
                enablejsapi="true"
                onready="playerReady"
                onstatechange="stateChanged"
                >
            </ng-youtube-embed>
          </li>

        </flex-slider>
      </div>
      <div class="col-sm-12">

        <flex-slider class="stop" slider-id="carousel" flex-slide="item in videos track by $index" animation="slide" animation-loop="false" item-width="210" item-margin="5" as-nav-for="#slider" slideshow="false" control-nav="false">
          <li>
            <md-card>
                 <img ng-src="https://img.youtube.com/vi/{{item.id}}/hqdefault.jpg" class="md-card-image"/>
                <md-content>
                 <md-card-title>
                   <md-card-title-text><span class="md-headline">{{item.title}}</span></md-card-title-text>
                 </md-card-title>
                 <md-card-content>
                   {{item.description}}
                </md-card-content>
              </md-content>
            </md-card>
          </li>
        </flex-slider>
      </div>
    </div>
  </div>`

        <flex-slider slider-id="slider" flex-slide="item in videos track by $index" animation="fade" animation-loop="false" sync="#carousel" slideshow="false" control-nav="false" init-delay="100">

          <li>
            <ng-youtube-embed
                video="item.id"
                videoid = "myvideo"
                autoplay="false"
                color="white"
                width="1280px"
                height="650px"
                disablekb="true"
                modestbranding="true"
                end="400"
                enablejsapi="true"
                onready="playerReady"
                onstatechange="stateChanged"
                >
            </ng-youtube-embed>
          </li>

        </flex-slider>
      </div>
      <div class="col-sm-12">

        <flex-slider class="stop" slider-id="carousel" flex-slide="item in videos track by $index" animation="slide" animation-loop="false" item-width="210" item-margin="5" as-nav-for="#slider" slideshow="false" control-nav="false">
          <li>
            <md-card>
                 <img ng-src="https://img.youtube.com/vi/{{item.id}}/hqdefault.jpg" class="md-card-image"/>
                <md-content>
                 <md-card-title>
                   <md-card-title-text><span class="md-headline">{{item.title}}</span></md-card-title-text>
                 </md-card-title>
                 <md-card-content>
                   {{item.description}}
                </md-card-content>
              </md-content>
            </md-card>
          </li>
        </flex-slider>
      </div>
    </div>
  </div>`

我想暂停当前播放的视频。我做错了什么

在视频旋转木马中一次播放一个视频是相当棘手但很容易的

        <flex-slider slider-id="slider" flex-slide="item in videos track by $index" animation="fade" animation-loop="false" sync="#carousel" slideshow="false" control-nav="false" init-delay="100">

          <li>
            <ng-youtube-embed
                video="item.id"
                videoid = "myvideo"
                autoplay="false"
                color="white"
                width="1280px"
                height="650px"
                disablekb="true"
                modestbranding="true"
                end="400"
                enablejsapi="true"
                onready="playerReady"
                onstatechange="stateChanged"
                >
            </ng-youtube-embed>
          </li>

        </flex-slider>
      </div>
      <div class="col-sm-12">

        <flex-slider class="stop" slider-id="carousel" flex-slide="item in videos track by $index" animation="slide" animation-loop="false" item-width="210" item-margin="5" as-nav-for="#slider" slideshow="false" control-nav="false">
          <li>
            <md-card>
                 <img ng-src="https://img.youtube.com/vi/{{item.id}}/hqdefault.jpg" class="md-card-image"/>
                <md-content>
                 <md-card-title>
                   <md-card-title-text><span class="md-headline">{{item.title}}</span></md-card-title-text>
                 </md-card-title>
                 <md-card-content>
                   {{item.description}}
                </md-card-content>
              </md-content>
            </md-card>
          </li>
        </flex-slider>
      </div>
    </div>
  </div>`
就连我几天前也遇到了同样的问题,当时我正在制作视频传送带。。。最后,我现在有了一个解决方案。。。首先,使用
标记嵌入youtube视频,并在视频url的末尾键入以下内容
?html5=1&enablejsapi=1
。。。然后直接在您的项目中包含以下JavaScript代码,而无需对其进行任何编辑

        <flex-slider slider-id="slider" flex-slide="item in videos track by $index" animation="fade" animation-loop="false" sync="#carousel" slideshow="false" control-nav="false" init-delay="100">

          <li>
            <ng-youtube-embed
                video="item.id"
                videoid = "myvideo"
                autoplay="false"
                color="white"
                width="1280px"
                height="650px"
                disablekb="true"
                modestbranding="true"
                end="400"
                enablejsapi="true"
                onready="playerReady"
                onstatechange="stateChanged"
                >
            </ng-youtube-embed>
          </li>

        </flex-slider>
      </div>
      <div class="col-sm-12">

        <flex-slider class="stop" slider-id="carousel" flex-slide="item in videos track by $index" animation="slide" animation-loop="false" item-width="210" item-margin="5" as-nav-for="#slider" slideshow="false" control-nav="false">
          <li>
            <md-card>
                 <img ng-src="https://img.youtube.com/vi/{{item.id}}/hqdefault.jpg" class="md-card-image"/>
                <md-content>
                 <md-card-title>
                   <md-card-title-text><span class="md-headline">{{item.title}}</span></md-card-title-text>
                 </md-card-title>
                 <md-card-content>
                   {{item.description}}
                </md-card-content>
              </md-content>
            </md-card>
          </li>
        </flex-slider>
      </div>
    </div>
  </div>`
所需函数的JavaScript代码如下-

        <flex-slider slider-id="slider" flex-slide="item in videos track by $index" animation="fade" animation-loop="false" sync="#carousel" slideshow="false" control-nav="false" init-delay="100">

          <li>
            <ng-youtube-embed
                video="item.id"
                videoid = "myvideo"
                autoplay="false"
                color="white"
                width="1280px"
                height="650px"
                disablekb="true"
                modestbranding="true"
                end="400"
                enablejsapi="true"
                onready="playerReady"
                onstatechange="stateChanged"
                >
            </ng-youtube-embed>
          </li>

        </flex-slider>
      </div>
      <div class="col-sm-12">

        <flex-slider class="stop" slider-id="carousel" flex-slide="item in videos track by $index" animation="slide" animation-loop="false" item-width="210" item-margin="5" as-nav-for="#slider" slideshow="false" control-nav="false">
          <li>
            <md-card>
                 <img ng-src="https://img.youtube.com/vi/{{item.id}}/hqdefault.jpg" class="md-card-image"/>
                <md-content>
                 <md-card-title>
                   <md-card-title-text><span class="md-headline">{{item.title}}</span></md-card-title-text>
                 </md-card-title>
                 <md-card-content>
                   {{item.description}}
                </md-card-content>
              </md-content>
            </md-card>
          </li>
        </flex-slider>
      </div>
    </div>
  </div>`
      <script>
    var ytplayerList;

    function onPlayerReady(e) {
        var video_data = e.target.getVideoData(),
            label = video_data.video_id+':'+video_data.title;
        e.target.ulabel = label;
        console.log(label + " is ready!");

    }
    function onPlayerError(e) {
        console.log('[onPlayerError]');
    }
    function onPlayerStateChange(e) {
        var label = e.target.ulabel;
        if (e["data"] == YT.PlayerState.PLAYING) {
            console.log({
                event: "youtube",
                action: "play:"+e.target.getPlaybackQuality(),
                label: label
            });
            //if one video is play then pause other
            pauseOthersYoutubes(e.target);
        }
        if (e["data"] == YT.PlayerState.PAUSED) {
            console.log({
                event: "youtube",
                action: "pause:"+e.target.getPlaybackQuality(),
                label: label
            });
        }
        if (e["data"] == YT.PlayerState.ENDED) {
            console.log({
                event: "youtube",
                action: "end",
                label: label
            });
        }
        //track number of buffering and quality of video
        if (e["data"] == YT.PlayerState.BUFFERING) {
            e.target.uBufferingCount?++e.target.uBufferingCount:e.target.uBufferingCount=1; 
            console.log({
                event: "youtube",
                action: "buffering["+e.target.uBufferingCount+"]:"+e.target.getPlaybackQuality(),
                label: label
            });
            //if one video is play then pause other, this is needed because at start video is in buffered state and start playing without go to playing state
            if( YT.PlayerState.UNSTARTED ==  e.target.uLastPlayerState ){
                pauseOthersYoutubes(e.target);
            }
        }
        //last action keep stage in uLastPlayerState
        if( e.data != e.target.uLastPlayerState ) {
            console.log(label + ":state change from " + e.target.uLastPlayerState + " to " + e.data);
            e.target.uLastPlayerState = e.data;
        }
    }
    function initYoutubePlayers(){
        ytplayerList = null; //reset
        ytplayerList = []; //create new array to hold youtube player
        for (var e = document.getElementsByTagName("iframe"), x = e.length; x-- ;) {
            if (/youtube.com\/embed/.test(e[x].src)) {
                ytplayerList.push(initYoutubePlayer(e[x]));
                console.log("create a Youtube player successfully");
            }
        }

    }
    function pauseOthersYoutubes( currentPlayer ) {
        if (!currentPlayer) return;
        for (var i = ytplayerList.length; i-- ;){
            if( ytplayerList[i] && (ytplayerList[i] != currentPlayer) ){
                ytplayerList[i].pauseVideo();
            }
        }  
    }
    //init a youtube iframe
    function initYoutubePlayer(ytiframe){
        console.log("have youtube iframe");
        var ytp = new YT.Player(ytiframe, {
            events: {
                onStateChange: onPlayerStateChange,
                onError: onPlayerError,
                onReady: onPlayerReady
            }
        });
        ytiframe.ytp = ytp;
        return ytp;
    }
    function onYouTubeIframeAPIReady() {
        console.log("YouTubeIframeAPI is ready");
        initYoutubePlayers();
    }
    var tag = document.createElement('script');
    //use https when loading script and youtube iframe src since if user is logging in youtube the youtube src will switch to https.
    tag.src = "https://www.youtube.com/iframe_api";
    var firstScriptTag = document.getElementsByTagName('script')[0];
    firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);    

  </script>

沟球转盘
&拉阔;
&拉阔;
游戏主义者;
函数onPlayerReady(e){
var video_data=e.target.getVideoData(),
label=video_data.video_id+':'+video_data.title;
e、 target.ulabel=标签;
日志(标签+“准备就绪!”);
}
函数onplayerror(e){
log(“[onplayerror]”);
}
函数onPlayerStateChange(e){
var标签=e.target.ulabel;
如果(e[“数据”]==YT.PlayerState.PLAYING){
console.log({
事件:“youtube”,
动作:“播放:+e.target.getPlaybackQuality(),
标签:标签
});
//如果正在播放一个视频,则暂停另一个视频
暂停其他管道(如目标);
}
如果(e[“数据”]==YT.PlayerState.PAUSED){
console.log({
事件:“youtube”,
操作:“暂停:+e.target.getPlaybackQuality(),
标签:标签
});
}
如果(e[“数据”]==YT.PlayerState.ENDED){
console.log({
事件:“youtube”,
行动:“结束”,
标签:标签
});
}
//缓冲音轨数和视频质量
如果(e[“数据”]==YT.PlayerState.BUFFERING){
e、 target.uBufferingCount?+e.target.uBufferingCount:e.target.uBufferingCount=1;
console.log({
事件:“youtube”,
操作:“缓冲[”+e.target.uBufferingCount+”]:“+e.target.getPlaybackQuality(),
标签:标签
});
//如果播放一个视频,则需要暂停另一个视频,因为开始时视频处于缓冲状态,开始播放时不进入播放状态
if(YT.PlayerState.UNSTARTED==e.target.uLastPlayerState){
暂停其他管道(如目标);
}
}
//最后一个动作在uLastPlayerState中保持阶段
if(e.data!=e.target.uLastPlayerState){
console.log(标签+”:状态从“+e.target.uLastPlayerState+”更改为“+e.data”);
e、 target.uLastPlayerState=e.data;
}
}
函数inityoutubeplyers(){
ytplayerList=null;//重置
ytplayerList=[];//创建新数组以容纳youtube播放器
对于(var e=document.getElementsByTagName(“iframe”),x=e.length;x--;){
if(/youtube.com\/embed/.test(e[x].src)){
ytplayerList.push(inityoutubeplyer(e[x]);
log(“成功创建Youtube播放器”);
}
}
}
功能暂停其他输出管(currentPlayer){
如果(!currentPlayer)返回;
for(var i=ytplayerList.length;i--;){
if(ytplayerList[i]&&(ytplayerList[i]!=currentPlayer)){
ytplayerList[i].pauseVideo();
}
}  
}
//初始化youtube iframe
函数inityoutubeplyer(ytiframe){
log(“拥有youtube iframe”);
var ytp=新的YT.播放器(YT帧{
活动:{
onStateChange:onPlayerStateChange,
onError:ONPLAYERROR,
onReady:onPlayerReady
}
});
ytiframe.ytp=ytp;
返回ytp;
}
函数onyoutubeiframeapiredy(){
log(“YouTubeIframeAPI已准备就绪”);
initYoutubePlayers();
}
var tag=document.createElement('script');
//加载脚本和youtube iframe src时使用https,因为如果用户登录youtube,youtube src将切换到https。
tag.src=”https://www.youtube.com/iframe_api";
var firstScriptTag=document.getElementsByTagName('script')[0];
firstScriptTag.parentNode.insertBefore(标记,